如何实现Qt Designer中定义的信号/槽

问题描述 投票:0回答:2

我正在尝试将按钮的

click()
信号连接到我自己的函数。该按钮位于我使用 QT Designer 创建的小部件中。我使用 QUiLoader 加载
.ui
文件,如下所示:

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 中连接信号和插槽,但是如何在代码中准备并进行此类连接? 附带问题:上面的代码可以工作,但主窗口显示的大小错误。如何确保它以正确的尺寸显示?我应该在最小高度/宽度限制的情况下执行此操作吗?

python pyqt pyside signals-slots qt-designer
2个回答
13
投票

使用信号和槽编辑模式将预定义的 Qt 信号直接连接到预定义的 Qt 槽。

因此,对于简单对话框上的“关闭”按钮,您只需将连接从按钮拖到对话框中,选择

clicked()
信号和
reject()
插槽,单击“确定”,就没有什么了做。

对于您想要自己定义的信号和/或槽,您可以直接在代码中建立连接,也可以通过 Qt Designer 间接建立连接。您的示例已经很好地演示了第一个选项,但是连接可以更简单、更干净地完成,如下所示:

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

在 Qt Designer 中进行连接更加复杂。首先,您必须切换到信号/槽编辑模式(通过按F4或单击工具栏按钮),然后在发送器/接收器对象之间拖动连接。这将打开“配置连接”对话框,您可以在其中单击编辑按钮之一打开信号/槽编辑器,然后单击加号按钮手动添加您将在自己的代码中定义的任何信号/槽的签名(请参阅截图如下)。完成此操作后,您可以关闭第二个对话框并在第一个对话框中建立相关连接。但需要明确的是:这将不会在 Qt Designer 本身内创建任何信号和槽 - 它所做的只是允许您指定代码稍后可以使用的名称。此外,只能手动将信号/槽添加到 custom 类,例如顶级表单和 promoted widgets

screenshot


至于您的主窗口具有“错误的大小”:很难从您显示的代码中看出,但这可能是因为您没有在正在加载的小部件中设置布局。

顺便说一句:您使用

QUiLoader
有什么具体原因吗?使用
pyuic4
编译 python 模块更加灵活,您可以从生成的代码中学到很多东西。

编辑

对我来说,在主窗体上设置布局可以解决您所说的调整大小问题。

如果您不知道该怎么做:在 Designer 中,右键单击主窗体的空白部分,然后从菜单中选择

Layout/Layout in a Grid
(工具栏上还有一个用于此操作的按钮)。

完成此操作后,调整表单大小将自动拉伸它以适合包含的小部件。


0
投票

我编辑了

.ui
文件:

  1. 关闭QT设计器
  2. 编辑插槽/信号区域中的
    .ui
  3. 运行它
© www.soinside.com 2019 - 2024. All rights reserved.