一、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(r'F:\火狐瀏覽器下載的文件\test.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(r'F:\火狐瀏覽器下載的文件\test.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_())
結果:
當鼠標放置在窗體上時候,會出現該氣泡提示。