Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子类化QMainWindow和QApplication之间的区别_Python_Pyqt5 - Fatal编程技术网

Python 子类化QMainWindow和QApplication之间的区别

Python 子类化QMainWindow和QApplication之间的区别,python,pyqt5,Python,Pyqt5,我试着在他们中的任何一个都没有注意到变化的情况下制作一个窗口……所以你实际上是在问这样的问题: 子类化list和子类化int之间有什么区别 虽然这两个类都继承自同一个类(在您的例子中,pythonobjectforlist和int),但它们做的事情完全不同 QApplication继承自(反过来,QApplication继承自)。 Qt应用程序负责运行和管理Qt,它的创建对于创建许多Qt元素并与之交互是必需的。最重要的是,Qt小部件(窗口、按钮等)始终需要QApplication,以便正确显示它

我试着在他们中的任何一个都没有注意到变化的情况下制作一个窗口……所以你实际上是在问这样的问题:

子类化
list
和子类化
int
之间有什么区别

虽然这两个类都继承自同一个类(在您的例子中,python
object
for
list
int
),但它们做的事情完全不同

QApplication继承自(反过来,QApplication继承自)。
Qt应用程序负责运行和管理Qt,它的创建对于创建许多Qt元素并与之交互是必需的。最重要的是,Qt小部件(窗口、按钮等)始终需要QApplication,以便正确显示它们并允许完全的用户交互

启动应用程序时(通过运行其
exec()
),您将进入其事件循环。这意味着它将等待来自代码、用户或系统的任何事件,并做出相应的反应。这就是事件循环的概念:它将静默地空闲,等待“某事”发生

例如,如果在QDialog上调用
show()
,Qt将创建一个show事件,该事件将被“发送”到操作系统,告诉它将显示一个新的“窗口”;系统将创建一个窗口,Qt将知道该窗口的处理程序,Qt将创建一个“绘制事件”,该事件将由对话框的
paintEvent
接收:在该方法中,窗口将实际“绘制”,并最终显示给用户。(注意,这是一个巨大的过度简化:事实上事情比这更复杂,但这不是这个答案的范围)

QMainWindow继承自QWidget,QWidget是表示Qt中GUI元素的所有对象的基类。
简单地说,它本身几乎什么都不做。它只对Qt应用程序发送的事件做出反应:上述绘制事件,还包括键盘/鼠标事件或系统请求。 如果向其发送了paintEvent,它将“绘制”窗口内容。如果鼠标点击它,它将尝试将其发送到该事件坐标处存在的小部件,等等

正如您所看到的,这些类做的事情非常不同。
总之:子类化QMainWindow或QApplication之间有巨大的区别。。。因为没有。
这完全取决于您的需要,因为这些类的使用非常不同,因为它们介于
list
int
之间

子类化通常仅在需要扩展或修改现有类的功能时进行。 如果您需要扩展或修改Qt主窗口小部件的行为,您将创建QMainWindow子类。 如果您需要扩展或修改Qt应用程序的行为,您将为Q[Core | Gui]应用程序创建子类

可能的情况:

  • 我想创建一个主窗口类,当实例化时,它已经有一个带有“文件”子菜单和一些小部件的菜单栏,这样我就可以创建更多的主窗口,并且所有的主窗口都已经使用该菜单进行了设置:子类QMainWindow
  • 我需要一个管理多个主窗口的应用程序,并且我希望使用一个公共界面与它们交互(当一个窗口关闭时,打开另一个窗口,等等),来跟踪它们:子类QApplication
  • 我只需要一个主窗口,但我必须重写它的许多方法,“猴子补丁”将是一团混乱:子类QMainWindow
  • 我必须过滤应用程序范围内的事件并对其进行处理(例如,有多个窗口和对话框,但如果所有窗口和对话框都关闭了,我不想退出应用程序,因为有些可能会在一段时间后或在某些用户交互后重新出现):子类QApplication
请注意,理论上,上面列出的所有情况都可以在不使用子类化和只使用匿名函数的情况下实现,但这会降低代码的整洁度,更重要的是,降低可读性和可调试性

最后:

  • 考虑到在大多数情况下,没有必要对Qt应用程序进行子类化
  • 这两个类都继承自QObject,它是大多数Qt类的基础:它支持信号/插槽机制,可以与Qt或应用程序交互(如果存在,并非所有QObject后代都需要Qt应用程序:Qt应用程序本身就是QObject子类)
  • 您应该仔细研究如何工作,以及一般来说,什么是类和实例
    QApplication和QMainWindow唯一的共同点是它们都继承自QObject。您是如何使用Window的,无论是子类QMainWindow还是QApplication都没有区别?我只是想创建一个基本窗口
    Class Window (QMainWindow):
    
    Class Window (QApplication):