Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4024
  • 博文数量: 1
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-23 12:52
文章分类
文章存档

2012年(1)

我的朋友
最近访客

分类: Python/Ruby

2012-04-04 11:44:17

    
    利用python的内省特性,把qt的QWidget类的及其子类的继承关系映射到一个QTreeWidget中,设置双击item事件的响应函数为新建一个类的实例,并显示出来。
    有些类对应c++的纯虚类,不能实例化,因此不能显示,有些必须要提供参数才能实例化,暂不能显示,以上情况会弹出对话框提示。

  1. #coding=utf-8
  2. #运行需要python2.7或python3.x,并安装PyQt

  3. import PyQt4.Qt as qt
  4. from PyQt4 import QtGui
  5. import sys

  6. def addChildItem(item):
  7.     klass=getattr(qt,str(item.text(0)))
  8.     for subKlass in klass.__subclasses__():
  9.         if subKlass.__module__==QtGui.__name__:
  10.             childItem=qt.QTreeWidgetItem([subKlass.__name__])
  11.             addChildItem(childItem)
  12.             item.addChild(childItem)
  13.             
  14. class QWidgetKlassTree(qt.QTreeWidget):
  15.     def __init__(self):
  16.         qt.QTreeWidget.__init__(self)
  17.         self.setColumnCount(1)
  18.         self.setHeaderHidden(True)
  19.         
  20.         rootItem=qt.QTreeWidgetItem(["QWidget"])
  21.         addChildItem(rootItem)
  22.         
  23.         self.addTopLevelItem(rootItem)
  24.         
  25.         self.doubleClicked.connect(self.onDoubleClicked)
  26.     def onDoubleClicked(self,index):
  27.         klass=getattr(qt,str(self.currentItem().text(0)))
  28.         try:
  29.             if klass.__name__=="QFocusFrame":
  30.                 raise Exception("QFocusFrame会使程序崩溃")
  31.             dialog=qt.QDialog(self)
  32.             dialog.setWindowTitle(klass.__name__)
  33.             dialog.setMinimumSize(200,200)
  34.             widget=klass()
  35.             layout=qt.QHBoxLayout()
  36.             layout.addWidget(widget)
  37.             dialog.setLayout(layout)
  38.             dialog.show()
  39.         except Exception as e:
  40.             qt.QMessageBox.warning(self,type(e).__name__,str(e))
  41. if __name__=="__main__":
  42.     app=qt.QApplication(sys.argv)
  43.     mainWidow=QWidgetKlassTree()
  44.     mainWidow.show()
  45.     app.exec_()


阅读(761) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~