利用python的内省特性,把qt的QWidget类的及其子类的继承关系映射到一个QTreeWidget中,设置双击item事件的响应函数为新建一个类的实例,并显示出来。
有些类对应c++的纯虚类,不能实例化,因此不能显示,有些必须要提供参数才能实例化,暂不能显示,以上情况会弹出对话框提示。
- #coding=utf-8
- #运行需要python2.7或python3.x,并安装PyQt
- import PyQt4.Qt as qt
- from PyQt4 import QtGui
- import sys
- def addChildItem(item):
- klass=getattr(qt,str(item.text(0)))
- for subKlass in klass.__subclasses__():
- if subKlass.__module__==QtGui.__name__:
- childItem=qt.QTreeWidgetItem([subKlass.__name__])
- addChildItem(childItem)
- item.addChild(childItem)
-
- class QWidgetKlassTree(qt.QTreeWidget):
- def __init__(self):
- qt.QTreeWidget.__init__(self)
- self.setColumnCount(1)
- self.setHeaderHidden(True)
-
- rootItem=qt.QTreeWidgetItem(["QWidget"])
- addChildItem(rootItem)
-
- self.addTopLevelItem(rootItem)
-
- self.doubleClicked.connect(self.onDoubleClicked)
- def onDoubleClicked(self,index):
- klass=getattr(qt,str(self.currentItem().text(0)))
- try:
- if klass.__name__=="QFocusFrame":
- raise Exception("QFocusFrame会使程序崩溃")
- dialog=qt.QDialog(self)
- dialog.setWindowTitle(klass.__name__)
- dialog.setMinimumSize(200,200)
- widget=klass()
- layout=qt.QHBoxLayout()
- layout.addWidget(widget)
- dialog.setLayout(layout)
- dialog.show()
- except Exception as e:
- qt.QMessageBox.warning(self,type(e).__name__,str(e))
- if __name__=="__main__":
- app=qt.QApplication(sys.argv)
- mainWidow=QWidgetKlassTree()
- mainWidow.show()
- app.exec_()
阅读(761) | 评论(0) | 转发(0) |