Как реализовать сигнал/слот, определенный в Qt Designer

Я пытаюсь подключить сигнал click() кнопки к моей собственной функции. Кнопка находится в виджете, который я создал с помощью 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"

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


person Sven    schedule 05.01.2012    source источник


Ответы (1)


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

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

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

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

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

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

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

ИЗМЕНИТЬ

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

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

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

person ekhumoro    schedule 05.01.2012
comment
Спасибо хорошо работает! Проблемы с размером, помогла установка минимальных размеров в Qt Designer. Я подумал, что, возможно, есть программный способ обеспечить размер главного окна, чтобы все виджеты внутри него были видны. - person Sven; 06.01.2012
comment
Re QUiLoader, никакой конкретной причины, кроме того, что это просто. Для подхода pyuic4 мне придется изучить, как заставить Eclipse/PyDev запускать pyuic4 автоматически для файлов .ui. - person Sven; 06.01.2012
comment
@Свен. Смотрите мой обновленный ответ об изменении размера: я уверен, что это проблема макета. - person ekhumoro; 06.01.2012
comment
Еще раз спасибо, это сработало для моих проблем с изменением размера. Мне начинает нравиться pyQt! - person Sven; 13.01.2012