【问题标题】:replacing widget at runtime在运行时替换小部件
【发布时间】:2010-11-26 04:46:54
【问题描述】:

情况是这样的。我有一个派生自 QListView 的类,它添加了一些便利功能,如果您愿意,可以使用自定义小部件。我不想与设计师搏斗来使用我的小部件。我只是想在设计器中使用一个普通的 QlistView(作为占位符)并用 pyuic4 编译它。在运行时,我想用我自己的版本替换那个普通的 QListView。

你怎么能做到这一点?

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

self.lstView1 = MyListView

但它没有......

【问题讨论】:

  • 请更具体。 “但它没有”不足以解释。编译时是否有错误?运行时是否有错误?错误是什么?
  • 以上行没有错误。我的旧的普通 QListView 仍然存在(可见)并且没有我的自定义 QListView 的迹象。我也尝试了一些其他选项: self.lstView1 = MyListView(self): here using self (a QDialog) as parent。自定义列表视图现在显示但在错误的位置(在左上角的某个地方并且非常小)。然后我尝试了 self.lstType = TypeList(self.layoutWidget) 其中 self.layoutWidget 是占位符小部件(普通 QListView)使用的布局。它又出现了,但仍然不在正确的位置。顺便说一句,旧的 QListview 仍然存在并且永远不会被删除。

标签: python user-interface pyqt


【解决方案1】:

问题在于您实际上只是替换了 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 并在设计器中创建和使用您的小部件,它既简单又快捷。

【讨论】:

  • 它不起作用,因为 self.lstView1 将在 setupUI 中重新分配
【解决方案2】:

使用QLayout替换功能:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多