【问题标题】:How to create a slot / signal for a button in a QMainWindow created by QT4 Designer如何在 QT4 Designer 创建的 QMainWindow 中为按钮创建插槽/信号
【发布时间】:2018-04-17 11:52:02
【问题描述】:

我想要一个使用 qt4 的 python 2 程序,当在 QMainWindow 中按下按钮时,它会打印到终端。如何在 QT4 Designer 创建的 QMainWindow 中为按钮创建插槽/信号?

我已经尝试了我能想到的一切,但我不明白如何将我在网上找到的内容应用到这个问题上。我对python很陌生,这可能是原因,如果这很明显,请原谅,但我很困惑。我发现的教程是 C++ 的 qt4,而不是 python。如果不出意外,至少下一个人将能够从中学习。

简化示例问题

我得到的错误是:

$ python ./main.py 
Traceback (most recent call last):
  File "./main.py", line 27, in <module>
    myGUI.connect(myGUI.pushButton,QtCore.SIGNAL(_fromUtf8("clicked()")),pushButtonCLICK)
AttributeError: 'QMainWindow' object has no attribute 'pushButton'

ma​​in.py:

#!/usr/bin/env python
import sys

import PyQt4 
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtCore import SIGNAL
from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout, QMainWindow

import gui

def pushButtonCLICK():
    print("you pressed the button! Yay! \n")


def main(args):
    return 0

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)

    myGUI = QtGui.QMainWindow()
    ui = gui.Ui_MainWindow()
    ui.setupUi(myGUI)
    myGUI.show()
    myGUI.connect(myGUI.pushButton,QtCore.SIGNAL(_fromUtf8("clicked()")),pushButtonCLICK)


    sys.exit(app.exec_())

在 QT4 Designer 中设计一个QMainWindow,保存为“.ui”文件并使用以下方法转换为 python:

pyuic4 -x ./test.ui -o ./gui.py

gui.ui::

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>333</width>
    <height>245</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>120</x>
      <y>50</y>
      <width>85</width>
      <height>30</height>
     </rect>
    </property>
    <property name="text">
     <string>ClickHere</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>333</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

gui.py:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file './test.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(333, 245)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(120, 50, 85, 30))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 333, 26))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.pushButton.setText(_translate("MainWindow", "ClickHere", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python qt pyqt pyqt4 qt-designer


    【解决方案1】:
    #!/usr/bin/env python
    import sys
    
    import PyQt4 
    from PyQt4 import QtGui
    from PyQt4 import QtCore
    from PyQt4.QtCore import SIGNAL
    from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout, QMainWindow
    
    import gui
    
    def pushButtonCLICK():
        print("you pressed the button! Yay! \n")
    
    
    def main(args):
        return 0
    
    if __name__ == '__main__':
        import sys
        app = QtGui.QApplication(sys.argv)
    
        myGUI = QtGui.QMainWindow()
        ui = gui.Ui_MainWindow()
        ui.setupUi(myGUI)
        myGUI.show()
        myGUI.connect(ui.pushButton,QtCore.SIGNAL("clicked()"),pushButtonCLICK)
    
    
        sys.exit(app.exec_())
    

    【讨论】:

    • 新样式:将myGUI.connect(ui.pushButton,QtCore.SIGNAL("clicked()"),pushButtonCLICK)更改为ui.pushButton.clicked.connect(pushButtonCLICK)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多