QMainWindow和QWidget

Posted hexiaoqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QMainWindow和QWidget相关的知识,希望对你有一定的参考价值。

 

 一、QMainWindow

  QmainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件。在主窗口中可以添加控件,比如将工具栏、菜单栏、状态栏等添加到布局管理器中。

  窗口类型介绍:QMainWindow、QWidget、QDialog三个类都可以用来创建窗口,可以直接使用,也可以继承后使用。

  QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是GUI程序的主窗口。

  QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的。他没有菜单栏、工具栏、状态栏等。

  如果是主窗口,就使用QMainWindow类;

  如果是对话框,就使用QDialog类;

  如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用QWidget类。

  QMainWindow类中比较重要的方法:

  

方法                                                            描述                                                         
addToolBar()

添加工具栏

centralWidget() 返回窗口中心的一个控件,未设置时返回None
menuBar() 返回主窗口的菜单栏
setCentralWidget() 设置窗口中心的控件
setstatusBar() 设置状态栏
statusBar() 获得状态栏对象后,调用状态栏对象的showMessage(message,int timeout = 0)方法,显示状态栏信息。第一个参数是要显示的信息,第二个参数是信息停留的时间,单位是ms,默认值为0,表示一直显示状态栏信息。

QmainWindow有自己的布局,它不能再设置布局了

1、创建主窗口

 1 import sys
 2 from PyQt5.QtWidgets import QMainWindow, QApplication
 3 from PyQt5.QtGui import QIcon
 4 
 5 class MainWindow(QMainWindow):
 6     def __init__(self, parent = None):
 7         super(MainWindow, self).__init__(parent)
 8         self.resize(400, 200)
 9         self.status = self.statusBar()
10         self.status.showMessage(这是状态栏显示, 5000)
11         self.setWindowTitle(PyQt MainWindow例子)
12 
13 
14 if __name__ == __main__:
15     app = QApplication(sys.argv)
16     app.setWindowIcon(QIcon(rF:火狐浏览器下载的文件	est.jpg))
17     form = MainWindow()
18     form.show()
19     sys.exit(app.exec_())

 

结果:

技术分享图片

注意这里状态栏信息会显示5秒(代码里面设置了5秒)

2、主窗口居中显示

 1 from PyQt5.QtWidgets import QDesktopWidget, QApplication, QMainWindow
 2 import sys
 3 
 4 class winform(QMainWindow):
 5     def __init__(self, parent = None):
 6         super(winform, self).__init__(parent)
 7         self.setWindowTitle(主窗口放在屏幕中间的例子)
 8         self.resize(400, 200)
 9         self.center()
10 
11     def center(self):
12         screen = QDesktopWidget().screenGeometry() #计算显示屏的尺寸
13         size = self.geometry()          #计算qwidget的窗口大小
14         self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)  #把窗口移动到屏幕正中央
15 
16 if __name__ == __main__:
17     app = QApplication(sys.argv)
18     win = winform()
19     win.show()
20     sys.exit(app.exit(app.exec_()))

 

结果:

技术分享图片

在这里使用了QDeskWidget类用来显示计算机显示屏的一些参数信息。然后调用move函数将窗体移动到屏幕正中央。

3、关闭主窗口

 1 from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QHBoxLayout
 2 import sys
 3 
 4 class winform(QMainWindow):
 5     def __init__(self, parent = None):
 6         super(winform, self).__init__(parent)
 7         self.setWindowTitle(关闭主窗口例子)
 8         self.button1 = QPushButton(关闭主窗口1)
 9         # self.button2 = QPushButton(‘关闭主窗口2‘)
10         self.button1.clicked.connect(self.onButtonClick)  #绑定动作函数
11         # self.button2.clicked.connect(self.onButtonClick)  #绑定动作函数
12 
13         layout = QHBoxLayout()
14         layout.addWidget(self.button1)
15         # layout.addWidget(self.button2)
16 
17         main_frame = QWidget()
18         main_frame.setLayout(layout)
19         self.setCentralWidget(main_frame)
20 
21     def onButtonClick(self):
22         #sender是发送信号的对象,此处发送信号的对象是button1按钮
23         sender = self.sender()
24         print(sender.text() + 被按下了)
25         qApp = QApplication.instance()
26         qApp.quit()
27 
28 if __name__ == __main__:
29     app = QApplication(sys.argv)
30     form = winform()
31     form.show()
32     sys.exit(app.exec_())

 

 结果:

技术分享图片

这里在主窗口上面添加了一个Button按钮控件,并将其绑定到onButtonClick函数上面。当按下按钮的时候,会调用onButtonClick函数,该函数里面又调用了quit函数。主窗口退出。

二、QWidget

  基础窗口控件QWidget类是所有用户界面对象的基类,所有窗口或者控件都直接或间接继承自QWidget类。

1、QWidget不包含边框的常用函数

  • 改变用户区的面积:
    QWidget.resize(width, height)
    QWidget.resize(Qsize)
  • 获得用户区的大小:
    QWidget.size()

     

  • 获得用户区的宽度和高度:
    QWidget.width()
    QWidget.height()

     

 

  • 设置客户区的高度、宽度、和面积(形成的窗体不可以使用鼠标来改变大小)
    QWidget.setFixedHeight()
    QWidget.setFixedWidth()
    QWidget.setFixedSize()

     

  • 设置客户区的大小和位置:

    Qwidget.setGeometry(int x, int y, int width, int height)#位置和大小

 2、QWidget包含边框的常用函数

  • 获得窗体的大小和位置
    QWidget.frameGeometry()
  • 设置窗口的位置
    QWiget.move(int x, int y)

     

  • 获得窗口左上角的的坐标
    QWidget.pos()

3、屏幕坐标系统显示

 1 from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
 2 import sys
 3 
 4 app = QApplication(sys.argv)
 5 widget = QWidget()
 6 btn = QPushButton(widget)
 7 btn.setText("Button")
 8 
 9 #以QWidget左上角为(0, 0)点
10 btn.move(20, 20)
11 
12 widget.resize(300, 200)     #设置窗口的大小
13 widget.move(250, 200)       #设置窗口的位置   以显示屏作为标准
14 
15 widget.setWindowTitle(PyQt坐标系统例子)
16 widget.show()
17 print(QWidget:)
18 print(w.x() = %d%widget.x())      #窗体的位置
19 print(w.y() = %d%widget.y())
20 print(w.width() = %d%widget.width())      #窗体的尺寸
21 print(w.height() = %d%widget.height())
22 print(QWidget.geometry)
23 print(widget.geometry().x() = %d%widget.geometry().x())       #窗体用户区(即不包含边框)的位置
24 print(widget.geometry().y() = %d%widget.geometry().y())
25 print(widget.geometry().width() = %d%widget.geometry().width())       #窗体用户区(即不包含边框)的位置
26 print(widget.geometry().height() = %d%widget.geometry().height())
27 
28 sys.exit(app.exec_())

 

结果:

技术分享图片

4、建立一个主窗口

 

import sys
from PyQt5.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)

window = QWidget()
window.resize(300, 200)
window.move(250, 150)
window.setWindowTitle(hello PyQT5)
window.show()

sys.exit(app.exec_())

 

 结果:
技术分享图片

 

 5、设置程序图标

 

 1 import sys
 2 from PyQt5.QtWidgets import QApplication, QWidget
 3 from PyQt5.QtGui import QIcon
 4 
 5 class Icon(QWidget):
 6     def __init__(self, parent = None):
 7         super(Icon, self).__init__(parent)
 8         self.initUI()
 9 
10     def initUI(self):
11         self.setGeometry(300, 300, 1250, 150)
12         self.setWindowTitle(程序图标)
13         self.setWindowIcon(QIcon(rF:火狐浏览器下载的文件	est.jpg))
14 
15 if __name__ == __main__:
16     app = QApplication(sys.argv)
17     icon = Icon()
18     icon.show()
19     sys.exit(app.exec_())

 结果:

技术分享图片

6、显示气泡提示信息

 1 import sys
 2 from PyQt5.QtWidgets import QApplication, QWidget, QToolTip
 3 from PyQt5.QtGui import QFont
 4 
 5 class winform(QWidget):
 6     def __init__(self):
 7         super().__init__()
 8         self.initUI()
 9 
10     def initUI(self):
11         QToolTip.setFont(QFont(SansSerif, 10))
12         self.setToolTip(这是一个<b>气泡提示</b>)
13         self.setGeometry(200, 300, 400, 400)
14         self.setWindowTitle(气泡提示demo)
15 
16 if __name__ == __main__:
17     app = QApplication(sys.argv)
18     win = winform()
19     win.show()
20     sys.exit(app.exec_())

 

 结果:

技术分享图片

当鼠标放置在窗体上时候,会出现该气泡提示。

 



以上是关于QMainWindow和QWidget的主要内容,如果未能解决你的问题,请参考以下文章

QWidget,QMainWindow,QDialog和QFrame的区别

QT中将QWidget提升为QMainWindow

QT QMainWindow窗口中添加 QWidget容器类 应该怎么添加?

QMainWindow和QWidget分别作为主窗体时对Layout的影响

QWidget QMainWindow QDialog 之间的区别

如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow