首页 > 代码库 > C++Qt代码转PyQt代码指南

C++Qt代码转PyQt代码指南

C++Qt代码转PyQt代码指南

Table of Contents

1 举个栗子

#include <QApplication>

#include <QtGui>

#include <QtCore>

 

C++代码

int main(int argc, char *argv[])  

{  

   QApplication app(argc, argv);  

   QSplitter *splitter = new QSplitter;//QSplitter用户分割两个widget  

   QFileSystemModel *model = new QFileSystemModel;  

   model->setRootPath(QDir::currentPath());  

   QTreeView *tree = new QTreeView(splitter);  

   tree->setModel(model); //为视图设置模型  

   tree->setRootIndex(model->index(QDir::currentPath()));  

   QListView *list = new QListView(splitter);  

   list->setModel(model);   

   list->setRootIndex(model->index(QDir::currentPath()));  

   splitter->setWindowTitle("Two views onto the same file system model");  

   splitter->show();  

   return app.exec();  

}  

from PyQt4 import QtGui

from PyQt4 import QtCore

import sys

 

转换后

def main(argv):

    app = QtGui.QApplication(argv)

    splitter = QtGui.QSplitter()

    model = QtGui.QFileSystemModel()

    model.setRootPath(QtCore.QDir.currentPath())

    tree = QtGui.QTreeView(splitter)

    tree.setModel(model)

    tree.setRootIndex(model.index(QtCore.QDir.currentPath()))

    qlv_list = QtGui.QListView(splitter)

    qlv_list.setModel(model)

    qlv_list.setRootIndex(model.index(QtCore.QDir.currentPath()))

    splitter.setWindowTitle("Two views onto the same file system model")

    splitter.show()

    return app.exec_()

 

if __name__ == ‘__main__‘:

    main(sys.argv)

运行如图 

2 变量生存周期

  • C++使用RTTI进行内存管理,或者手动管理 
  • Python使用引用计数,自动管理内存 
  • Qt内使用其树模型管理内存,父节点析构时,自动析构所有子节点 

是故,使用C++/Qt编程时,几乎所有的QObject实例对象构造时,都会记得加上其parent的引用以防止内存泄漏;同样,PyQt中依然 如此,倒不是防止其内存泄漏,因为Python会根据引用计数自动对类实例进行管理,一旦变量的超出其作用域而没有任何引用时会被自动析构,但生存于Qt 树模型中的对象却能幸免,见以下代码 

3 工具使用

IPython的自动提示与Python的自省 

4 备忘清单

  • 在PyQt中,所有的新对象均使用类似于栈对象的形式出现,但要留意其对象的生存周期,留意何时对象会被『析构』 
  • Python没有 『栈对象』与『堆对象』之分,故你可几乎无视C++的指针与引用之间的区别 
  • 拜上一点所赐,顺带可以无视C++的 实例引用(.) 与 指针引用(->) 之间的区别,在Python中,全部使用 (.) 点号替代 
  • Python的静态方法调用与实例方法调用方式都是用 (.) 点号,而C++用 命名空间符 (::),在PyQt中仍然全部使用 (.) 点号替代 
  • Python中没有C/C++中的enum(枚举)型,故枚举型的引用方式有所差异 
  • Python使用包、库的概念,而C++使用头文件概念,Qt没有使用C++的 namespace(命名空间) 
  • 留意部分特殊对象的生成方式如QIcon,这货大部分情况下在C++/Qt里都是栈对象,并非生存于Qt的树模型中 
  • 部分特殊对象如C++的QString与Python的String以及对应的Unicode之间的相互转换关系,请弄清楚平台编码(一般而 言,Win32使用GB系列,*Nix使用UTF-8)、命令行显示编码(指win32的cmd,一般使用GB系列)、终端编码(如果你使用Putty或 者XShell之类的工具,请留意终端编码与shell的$LANG环境变量)、文件编码、内存编码(如有可能,内存中的string,请全部使用 unicode) 
  • 标准库的对象转换关系,如QList与std::list与Python的list,我已经开始有点晕了,以此衍生的如 QListView,QStringList等,另外std::map,QMap,dict for python就不细说了,还是细看文档吧,Qt的文档很棒。 
  • 留意那些非QObject子类的对象如Qt的图形视图框架中的QGraphicsItem,别被坑到了 
  • Python2.7的关键字exec,PyQt中替换为exec_,在QDialog中亦是如此,这在Py3K中得到了改进 

Date: 2013-12-04T14:39+0800

 

C++Qt代码转PyQt代码指南