在运行时替换小部件

时间:2009-09-07 10:42:12

标签: python user-interface pyqt

情况如下。我有一个派生自QListView的类,它添加了一些便利功能,如果你愿意,还可以添加一个自定义小部件。我不想与Designer搏斗以使用我的小部件。我只想在Designer中使用普通的QlistView(作为占位符)并使用pyuic4进行编译。在运行时,我想用我自己的版本替换正常的QListView。

你怎么能这样做?

我希望 init 中的类似内容可以解决这个问题:

self.lstView1 = MyListView

但它没有...

2 个答案:

答案 0 :(得分:2)

问题在于您实际上只是替换了lstView1指向的对象,而不是将其添加到窗口小部件中。也就是说,当你创建对象时,你只需告诉python使用lstView1指向你的新对象,但是实际的UI正在使用旧指针,因为它已经添加了。

我假设您已经使用py4uci将ui文件转换为python并将gui设置为:

class ExambleUI(QtGUi.QDialog, UI_Example):
   def __init__(self, parent):
       QtGui.QDiialog.__init__(self, parent)
       self.setupUI(self)
       self.lstView1 = MyListView

因为setupUi在更改lstView的值之前正在执行,所以您没有获得新的小部件。你只需要换行:

class ExambleUI(QtGUi.QDialog, UI_Example):
   def __init__(self, parent):
       QtGui.QDiialog.__init__(self, parent)
       self.lstView1 = MyListView
       self.setupUI(self)

另一方面,我建议您遵循此tutorial并在设计器中创建和使用您的小部件,这很容易,也更快。

答案 1 :(得分:0)

使用QLayout替换功能:

ui->main_layout->replace(oldWidget, newWidget);