03-PyQt与C++/Qt的一些比较

  目前PyQt5可以实现C++/Qt的几乎全部逻辑,现在做一下两者的比较,方便对PyQt的理解。

比较项目

  1. 类调用
  2. ui文件编译
  3. 简单自定义类的代码结构
  4. 信号槽使用

基础使用

  • C++/Qt
#include 

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文件
  1. 在QtCreator中创建一个ui文件,这里直接使用自带的默认Form Template,得到"dialog.ui"
    03-PyQt与C++/Qt的一些比较_第1张图片
  2. 使用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

};
  1. 使用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 
#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信号槽的语法及应用。

你可能感兴趣的:(PyQt)