目錄
- 開發(fā)環(huán)境
- 主要文件:
- main.py
- app_main_window.py
- Tips
- QApplication與QWidget
開發(fā)環(huán)境
Win7 PyCharm Python3.5.1 PyQt5
主要文件:
|-- main.py
|-- res
| `-- fish.jpg
`-- ui
`-- app_widget.py
main.py
import sys
from PyQt5.QtWidgets import QApplication
from ui.app_widget import AppQWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = AppQWidget()
w.show()
sys.exit(app.exec_())
app_main_window.py
自定義了一個居中顯示的窗口,關(guān)閉時彈確認框
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QPushButton, QDesktopWidget, QMessageBox
class AppQWidget(QWidget):
"""
A custom QWidget by Rust Fisher
"""
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# self.setGeometry(300, 300, 400, 200) # 相當于move和resize
self.resize(300, 200)
self.move_to_center()
self.setWindowTitle('Demo1')
self.setWindowIcon(QIcon('res/fish.jpg'))
btn1 = QPushButton('Quit', self)
btn1.setToolTip('Click to quit')
btn1.resize(btn1.sizeHint())
btn1.move(200, 150)
btn1.clicked.connect(QCoreApplication.instance().quit) # cannot locate function connect
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message',
'Are you sure to quit now?',
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
def move_to_center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center() # got center info here
qr.moveCenter(cp)
self.move(qr.topLeft()) # 應(yīng)用窗口的左上方的點到qr矩形的左上方的點,因此居中顯示在我們的屏幕上
Tips
多控件可以存在list中
存在一起,需要對整體操作時直接遍歷列表
# 同組的控件可以存在同一個list中
self.cb_list = [
self.ma.i2cCB,
self.ma.mipiCB,
self.ma.eepromCB,
self.ma.tem_sensorCB,
self.ma.lensCB,
self.ma.vcmCB,
self.ma.mirrorCB,
self.ma.mirrorCaliCB, ]
self.test_count_et_list = [
self.ma.i2cCountEt,
self.ma.mipiCountEt,
self.ma.eepromCountEt,
self.ma.tem_sensorCountEt,
self.ma.lensCountEt,
self.ma.vcmCountEt,
self.ma.mirrorCountEt,
self.ma.mirrorCaliCountEt,
]
# 需要操作某組控件時 直接遍歷列表
def _click_test_item_cb(self):
""" Update [choose all checkbox] by all test item state """
choose_all = True
for cb in self.cb_list:
choose_all = choose_all cb.isChecked()
self.ma.selecteAllCB.setChecked(choose_all)
QApplication與QWidget
QApplication是一個單例,在QWidget中可以通過QApplication.instance()獲取到對象
實際上在實例化QApplication前就使用QtGui.QWidget()是會報錯的
>>> QtGui.QWidget()
QWidget: Must construct a QApplication before a QPaintDevice
參考 How QApplication() and QWidget() objects are connected in PySide/PyQt?
在我們自定義的QMainWindow中,也可以直接獲取到QApplication的實例。
class RustMainWindow(QMainWindow):
""" This is the main class """
def _trigger_english(self):
print "Change to English", QApplication.instance()
# Change to English PyQt4.QtGui.QApplication object at 0x02ABE3A0>
注意widget持有外部對象引用的問題
如果在程序啟動的地方將引用交給widget,退出時會造成應(yīng)用無法關(guān)閉的問題(類似內(nèi)存泄漏)。
if __name__ == '__main__':
app = QApplication(sys.argv)
# 這里把app交給了MainWindow,MainWindow關(guān)閉時是無法正常退出應(yīng)用的
main_d = RustMainWindow(app) # 不建議這么做
main_d.show()
sys.exit(app.exec_())
以上就是PyQt 如何創(chuàng)建自定義QWidget的詳細內(nèi)容,更多關(guān)于PyQt 創(chuàng)建自定義QWidget的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- python GUI庫圖形界面開發(fā)之PyQt5窗口控件QWidget詳細使用方法
- python GUI庫圖形界面開發(fā)之PyQt5中QMainWindow, QWidget以及QDialog的區(qū)別和選擇
- Python PyQt5-圖形界面的美化操作
- python中pyqtgraph知識點總結(jié)
- 詳解Python GUI編程之PyQt5入門到實戰(zhàn)
- 詳解Python3.8+PyQt5+pyqt5-tools+Pycharm配置詳細教程
- Python3.7安裝PyQt5 運行配置Pycharm的詳細教程
- Python 使用 PyQt5 開發(fā)的關(guān)機小工具分享
- Python+PyQt5+MySQL實現(xiàn)天氣管理系統(tǒng)
- python3.6.8 + pycharm + PyQt5 環(huán)境搭建的圖文教程