pyqt5可实现Qt设计UI界面,Python编写逻辑代码,发挥各自的优势
1. Qt Designer设计UI界面,保存,将.ui文件复制到Python项目文件夹下
2. Qt .ui文件转.py文件
打开Pycharm ->
File->
Settings->
Tools->
External Tools,点击 + ,添加新项目。设置如下:
3. Pycharm中右键复制过来的.ui文件,External Tools->PyUIC,即可获得.ui文件转化后的.py文件。
4. 新建Python文件main.py
import sys
from PyQt5.Qt import *
import mainwindow
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = mainwindow.Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
安装需要的package,如PyQt5,运行main.py,即可获得相应界面
5. 界面完成之后,通常还需要信号槽的实现,下面便是在pyqt5中如何使用信号槽
新建Python文件son.py,在该文件里实现信号与槽。这么做的好处是:信号槽的实现代码与界面代码mainwindow.py分开写,界面样式可以随时去Qt Designer更改,然后重新生成mainwindow.py文件,不会影响信号槽的实现。
from mainwindow import *
from PyQt5.QtWidgets import *
class Son(QMainWindow):
def __init__(self, name=""):
# 构造函数
super().__init__()
self.initUI(name)
def initUI(self, name):
# 初始化函数
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setWindowTitle(name)
# self.ui.horizontalSlider.setTracking(True)
# 关联信号槽
self.ui.horizontalSlider.valueChanged[int].connect(self.setValue)
# 定义槽函数
def setValue(self, value):
self.ui.lineEdit.setText(str(value))
main.py改写为如下
import sys
from PyQt5.Qt import *
import mainwindow
from son import *
if __name__ == '__main__':
app = QApplication(sys.argv)
# MainWindow = QMainWindow()
# ui = mainwindow.Ui_MainWindow()
# ui.setupUi(MainWindow)
# MainWindow.show()
Mainwindow=Son("主界面")
Mainwindow.show()
sys.exit(app.exec_())
6. 最终效果如下
7. 通过点击按钮,弹出二级界面
重复步骤1,3,获得二级界面的.py文件dialog.py,我这里基类是QDialog
新建son2.py文件,代码如下:
from dialog import *
from PyQt5.QtWidgets import *
class Son2(QDialog):
def __init__(self, name=""):
# 构造函数
super().__init__()
self.initUI(name)
def initUI(self, name):
# 初始化函数
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.setWindowTitle(name)
son.py添加如下代码,注意一定是self.Page2 .show(),不是Page2 .show()。否则Page2是个临时变量,窗口只是一闪而过。
from son2 import *
# 信号槽关联
self.ui.pushButton.clicked.connect(self.newPage)
#槽函数
def newPage(self):
self.Page2 = Son2("二级界面")
self.Page2 .show()
当使用show时,窗口默认为非模态,此时当前窗口可以与其它窗口进行交互。当使用exec时,为模态窗口,此时会阻塞线程,直到子事件循环退出之后,才能进行下一步操作。
son.py完整代码:
from mainwindow import *
from PyQt5.QtWidgets import *
from son2 import *
class Son(QMainWindow):
def __init__(self, name=""):
# 构造函数
super().__init__()
self.initUI(name)
def initUI(self, name):
# 初始化函数
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setWindowTitle(name)
# self.ui.horizontalSlider.setTracking(True)
# 关联信号槽
self.ui.horizontalSlider.valueChanged[int].connect(self.setValue)
self.ui.pushButton.clicked.connect(self.newPage)
# 定义槽函数
def setValue(self, value):
self.ui.lineEdit.setText(str(value))
def newPage(self):
self.Page2= Son2("二级界面")
self.Page2.show()