Ожидание нажатия кнопки в Qt - PullRequest
0 голосов
/ 19 августа 2011

У меня есть собственный класс, наследующий от QDialog. Я создаю этот диалог с функцией foo, и foo хотел бы продолжать делать свое дело только при нажатии определенной кнопки в диалоге. Я думал об использовании сигналов и слотов, но тогда как мне заставить foo ответить на сигнал из другого потока?

РЕДАКТИРОВАТЬ: в основном я хочу знать, как переопределить функциональность QInputDialog :: getText (), используя мой собственный диалог.

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Ваша функция foo () может вызывать wait () для объекта [QWaitCondition] [1], тогда ваша кнопка может вызывать wakeOne () для того же объекта, чтобы вызвать wait ().

Тем не менее, на самом деле нет необходимости использовать многопоточность для переопределения QInputDialog :: getText ().Вы должны быть в состоянии переопределить эту функциональность внутри одного потока без каких-либо проблем, и делать это таким образом будет намного проще и надежнее.

(Примечание: если вы хотите, чтобы ваша версия getText () блокировала ине возвращать, пока не будет нажата кнопка, вам нужно будет вызвать QDialog :: exec (). Хотя я не рекомендую этот стиль программирования, так как он подвержен ошибкам ... например, что произойдет, если пользователь закроетродительское окно вашего QInputDialog, в то время как QInputDialog все еще открыт?вместо этого делать все на основе событий (т.е. только сигналы и слоты), а не пытаться блокировать или рекурсировать цикл событий Qt в вашем собственном коде)

1 голос
/ 19 августа 2011

http://doc.qt.io/qt-4.8/qdialog.html#modal-dialogs

Модальные диалоги заблокируют пользователя от взаимодействия с другими окнами, что, как вам кажется, вам потребуется Кроме того, я думаю, что вы хотите вызвать exec () вместо show (). Show () немедленно возвращает выполнение вызывающей стороне, где блоки exec ().

...