运行时替换组件

3 投票
2 回答
2241 浏览
提问于 2025-04-15 14:07

这是一个情况。我有一个类,它是从QListView派生出来的,增加了一些方便的功能,可以说是一个自定义的小部件。我不想在设计器里费劲地使用我的小部件。我只是想在设计器中使用一个普通的QListView(作为占位符),然后用pyuic4编译它。在运行时,我想把这个普通的QListView替换成我自己的版本。

那该怎么做呢?

我希望在init里像这样做能解决问题:

self.lstView1 = MyListView

但结果并没有...

2 个回答

1

使用QLayout的替换功能:

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

问题在于,你实际上只是替换了lstView1指向的对象,但并没有把它添加到界面上。也就是说,当你创建新对象时,你只是告诉Python用lstView1指向这个新对象,但界面实际上还是在使用旧的指针,因为它已经被添加过了。

我假设你是用py4uci把ui文件转换成Python代码,并且你设置了界面如下:

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)

另外,我建议你参考这个教程,在设计器中创建和使用你的控件,这样更简单也更快。

撰写回答