Python GUI的两种不同语法->;不同的行为
我正在调查PyQt,有些事情对我来说绝对不清楚。 假设我想创建一个带有按钮的GUI。 许多在线示例都有此表单:Python GUI的两种不同语法->;不同的行为,python,python-3.x,pyqt,pyqt5,qt-designer,Python,Python 3.x,Pyqt,Pyqt5,Qt Designer,我正在调查PyQt,有些事情对我来说绝对不清楚。 假设我想创建一个带有按钮的GUI。 许多在线示例都有此表单: import sys from PyQt5 import QtCore, QtGui, QtWidgets class Example(QtWidgets.QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self):
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Example(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 200, 140)
self.setWindowTitle('Dialog')
self.aaa = QtWidgets.QPushButton(self)
self.aaa.setGeometry(QtCore.QRect(40, 40, 113, 32))
self.aaa.setObjectName("aaa")
self.aaa.setText( "PushButton")
self.show()
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Return:
self.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
但是,如果我使用Designer创建相同的GUI,然后通过“pyuic5-x test.ui-o test.py”将其转换为Python,我会得到一个稍微不同的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.setGeometry(300, 300, 200, 140)
self.aaa = QtWidgets.QPushButton(Dialog)
self.aaa.setGeometry(QtCore.QRect(40, 40, 113, 32))
self.aaa.setObjectName("aaa")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.aaa.setText(_translate("Dialog", "PushButton"))
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Return:
self.close()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
除了通话等区别外:
self.setGeometry(300, 300, 200, 140)
而不是
Dialog.setGeometry(300, 300, 200, 140)
有些差异我无法理解
- keyPressEvent在第一个示例中起作用,在第二个示例中不起作用
- 如果在第一个示例中按下“Escape”,则不会发生任何事情,如果在第二个示例中按下它,则应用程序将立即关闭
- 在第二个示例中,按钮高亮显示(因为它被设置为默认值,我找到了一种禁用它的方法),而在第一个示例中没有
- 在第二个示例中,我如何避免使用退出按钮退出我的应用程序
- 在第二个示例中,如何使keyPressEvent工作
- 我应该更喜欢第一种或第二种语法,还是它们是等价的
- 是否有方法将设计器文件“.ui”导出到具有第一个示例中语法的python文件
谢谢大家! 在第二个示例中,如何避免使用退出按钮退出我的应用程序? 此按钮默认激活,因为在第二个示例中,您使用的是具有此默认行为的
QDialog
小部件,因为它们用于创建用户必须选择选项的对话框,而第一个示例使用的是最基本的小部件QWidget
解决方案:使用作为小部件的模板,而不是一些没有按钮的对话框、底部有按钮的对话框或右侧有按钮的对话框
在第二个示例中,如何让keyPressEvent工作?
Qt Designer创建一个设计类,而不是创建一个小部件,即创建填充小部件的类,该小部件在第一段代码的主要部分中被观察到,并且只有小部件具有事件keyPressEvent。解决方案很简单,您必须创建一个继承自Dialog的类,并使用Qt Designer提供的类来实现小部件的填充
class Dialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(self, *args, **kwargs):
QtWidgets.QDialog.__init__(self, *args, **kwargs)
self.setupUi(self)
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Return:
self.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Dialog()
w.show()
sys.exit(app.exec_())
注意:
以下架构显示了在Qt designer中使用的模板以及必须继承的类:
+-----------------------------+--------------+
| Template | Widget Class |
+-----------------------------+--------------+
| Dialog with Buttons Bottom | QDialog |
| Dialog with Buttons Right | QDialog |
| Dialog without Buttons | QDialog |
| MainWindow | QMainWindow |
| Widget | QWidget |
+-----------------------------+--------------+
通常,您必须使用以下方案:
class Some_Name(Widget_Class, Template):
def __init__(self, *args, **kwargs):
Widget_Class.__init__(self, *args, **kwargs)
self.setupUi(self)
有关更多信息,请检查以下内容:
QDialog
小部件,因为它们用于创建用户必须选择选项的对话框,而第一个示例使用的是最基本的小部件QWidget
解决方案:使用作为小部件的模板,而不是一些没有按钮的对话框、底部有按钮的对话框或右侧有按钮的对话框
在第二个示例中,如何让keyPressEvent工作?
Qt Designer创建一个设计类,而不是创建一个小部件,即创建填充小部件的类,该小部件在第一段代码的主要部分中被观察到,并且只有小部件具有事件keyPressEvent。解决方案很简单,您必须创建一个继承自Dialog的类,并使用Qt Designer提供的类来实现小部件的填充
class Dialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(self, *args, **kwargs):
QtWidgets.QDialog.__init__(self, *args, **kwargs)
self.setupUi(self)
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Return:
self.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Dialog()
w.show()
sys.exit(app.exec_())
注意:
以下架构显示了在Qt designer中使用的模板以及必须继承的类:
+-----------------------------+--------------+
| Template | Widget Class |
+-----------------------------+--------------+
| Dialog with Buttons Bottom | QDialog |
| Dialog with Buttons Right | QDialog |
| Dialog without Buttons | QDialog |
| MainWindow | QMainWindow |
| Widget | QWidget |
+-----------------------------+--------------+
通常,您必须使用以下方案:
class Some_Name(Widget_Class, Template):
def __init__(self, *args, **kwargs):
Widget_Class.__init__(self, *args, **kwargs)
self.setupUi(self)
有关更多信息,请检查以下内容: