Как реализовать сигнал / слот, определенный в Qt Designer - PullRequest
8 голосов
/ 05 января 2012

Я пытаюсь подключить сигнал нажатия кнопки () кнопки к своей собственной функции. Кнопка находится в виджете, который я создал с помощью QT Designer. Я загружаю файл .ui с помощью QUiLoader следующим образом:

class MyWidget(QtGui.QMainWindow):
    def __init__(self, *args):  
        QtGui.QMainWindow.__init__(self, *args)

        loader = QtUiTools.QUiLoader()
        file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui")
        file.open(QtCore.QFile.ReadOnly)
        self.myWidget = loader.load(file, self)
        file.close()

        self.setCentralWidget(self.myWidget)

        btn = self.myWidget.findChild(QtGui.QPushButton, "HelloWorldButton")
        btn.clicked.connect(self.slot1)        

    def slot1(self):
        print "Received"

Это правильный способ подключения к сигналу нажатия кнопки ()? Я вижу, что могу подключать сигналы и слоты непосредственно в Qt Designer, но как мне подготовиться и добраться до таких подключений в коде? Дополнительный вопрос: приведенный выше код работает, но главное окно отображается с неверным размером. Как сделать так, чтобы он отображался с правильным размером? Должен ли я сделать это с минимальными ограничениями высоты / ширины?

1 Ответ

12 голосов
/ 06 января 2012

Используйте Режим редактирования сигналов и слотов для подключения предопределенных сигналов Qt непосредственно к предопределенным слотам Qt.

Так что для кнопки «Закрыть» в простом диалоге вы можете просто перетащить соединение изнажмите кнопку в диалоговом окне, выберите сигнал clicked() и слот reject(), нажмите «ОК», и вам больше нечего будет делать.

Для сигналов и / или слотов, которые вы хотите определить самиВам не нужно ничего заранее «готовить» в Designer.Все должно быть сделано в вашем собственном коде.

Ваш пример уже демонстрирует это довольно хорошо, но соединение может быть сделано намного проще и чище, как это:

self.myWidget.HelloWorldButton.clicked.connect(self.slot1)

Что касается вашегоГлавное окно имеет «неправильный размер»: это трудно определить по показанному вами коду, но это может быть связано с тем, что вы не установили макет в загружаемом виджете.

Кстати: есть?конкретная причина, по которой вы используете QUiLoader?Компиляция модулей Python с использованием pyuic4 гораздо более гибкая, и вы можете многому научиться из сгенерированного кода.

EDIT

Для меня настройка макетав основной форме устраняет проблему изменения размера, о которой вы говорите.

Если вы не знаете, как это сделать: в Designer щелкните правой кнопкой мыши пустую часть основной формы и выберите Layout/Layout in a Grid из меню (для этого есть также кнопка на панели инструментов).

Как только вы это сделаете, изменение размера формы автоматически растянет ее, чтобы она соответствовала содержащимся виджетам.

...