目前PyQt5可以实现C++/Qt的几乎全部逻辑,现在做一下两者的比较,方便对PyQt的理解。
比较项目
- 类调用
- ui文件编译
- 简单自定义类的代码结构
- 信号槽使用
基础使用
- C++/Qt
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv); // 创建app对象
QWidget w; // 创建QWidget对象
w.show(); // 显示QWidget
return app.exec();
}
- PyQt5
from PyQt5.Qt import QApplication,QWidget
import sys
if __name__ == '__main__':
app = QApplication(sys.argv) # 创建app对象
w = QWidget() # 创建QWidget对象
w.show() # 显示QWidget
sys.exit(app.exec_())
UI文件编译
C++/Qt | PyQt5 |
---|---|
使用uic.exe生成ui_xxx. h | 使用pyuic5.exe生成对应的py文件 |
- 在QtCreator中创建一个ui文件,这里直接使用自带的默认Form Template,得到"dialog.ui"
- 使用QtCreate进行编译
// 根据ui文件自动生成Ui_Dialog类,并实现setupUi的方法来进行界面排布。
class Ui_Dialog
{
public:
QDialogButtonBox *buttonBox;
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
Dialog->setObjectName(QString::fromUtf8("Dialog"));
Dialog->resize(400, 300);
buttonBox = new QDialogButtonBox(Dialog);
buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
buttonBox->setGeometry(QRect(30, 240, 341, 32));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
retranslateUi(Dialog);
QObject::connect(buttonBox, SIGNAL(accepted()), Dialog, SLOT(accept()));
QObject::connect(buttonBox, SIGNAL(rejected()), Dialog, SLOT(reject()));
QMetaObject::connectSlotsByName(Dialog);
} // setupUi
void retranslateUi(QDialog *Dialog)
{
Dialog->setWindowTitle(QCoreApplication::translate("Dialog", "Dialog", nullptr));
} // retranslateUi
};
使用pyqt5进行编译
cd命令到“dialog.ui”文件路径下, 使用命令 pyuic5.exe -o ui_Dialog.py dialog.ui
命令是将dialog.ui文件利用pyuic5.exe编译,并生成ui_Dialog.py文件,该文件会自动生成Ui_Dialog的类。
打开ui_Dialog.py,可以看到经过编译后的代码
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept)
self.buttonBox.rejected.connect(Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
类定义结构
- C++/Qt
#include <QWidget>
#include "ui_MyWidget.h"
class MyWidget: public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = Q_NULLPTR);
private:
Ui::MyWidgetClass ui;
};
MyWidget::MyWidget(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
- PyQt5
from PyQt5.Qt import QApplication,QWidget
form ui_MyWidget import Ui_MyWidget
class MyWidget(QWidget)
def __init__(self):
super().__init__(self,parent=none)
self.__ui = Ui_MyWidget() # 创建界面类作为私有函数
self.__ui.setupUi(self) # 创建UI界面
if __name__ == '__main__': # 测试代码,在执行当前py文件时会进入
app = QApplication(sys.argv) # 创建app对象
w = MyWidget() # 创建MyWidget对象
w.show() # 显示QWidget
sys.exit(app.exec_())
信号槽的使用
项目 | C++/Qt | PyQt5 |
---|---|---|
信号定义 | ![]() | ![]() |
包含两个信号。1、信号带一个str参数。2、信号带int和str两个参数 | 信号利用pyqtSignal声明,并进行参数声明 | |
槽定义 | ![]() | ![]() |
在普通成员函数上增加Q_SLOTS标识 | 使用装饰器(无重载可不需要)来修饰成员函数 | |
连接 | QObject::connect(sender,SIGNAL(signal()),reciever,SLOT(slot())) | sender.signal[param].connect(reciever.slot) |
此处只简单对比下两边信号槽的语法,后续章节再深入下pyqt信号槽的语法及应用。
版权声明:本文为tangfreeze原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。