自定义小部件的占位符

Posted

技术标签:

【中文标题】自定义小部件的占位符【英文标题】:Placeholder for a custom widget 【发布时间】:2013-01-06 23:57:46 【问题描述】:

我正在从 *.ui 文件加载 QMainWIdow 库。另外,我有一个自定义小部件,我想放在表单的某个位置。目前我在 .ui 文件中放入了一个名为 placeholder 的空 QVBoxLayout,并在 QMainWindow 子类中执行 self.placeholder.addWidget(my_custom_widget)

我唯一不喜欢这种方法的是空布局没有自己的大小。我可以有一个包含一个单元格和一个虚拟小部件(例如QLabel)的布局,具有我想要的大小,然后替换这个小部件,然后添加我的自定义小部件,但这种方法对我来说似乎太多了。

对于这样的任务,你的方法是什么?

我正在使用 Python (PyQt4)

【问题讨论】:

【参考方案1】:

这是一个关于如何推广小部件的简单小教程:

    右键单击要用作占位符的小部件,然后选择 Promote To...。 填写 Promoted Classes 弹出对话框字段: 基类名称:在本例中为QWidgetPromoted Class Name:用于定义要为其创建占位符的小部件的类名,此处为MyWidget 头文件/path/to/MyWidget.py 是放置MyWidget 的文件的路径。 单击添加后,将创建并显示该类,选择它并单击Promote。你已经完成了推广。 这是您应该在 Object Inspector 面板中看到的内容,类的名称不再是 QWidget,而是 MyWidget

    /path/to/MyWidget.py 的文件中,我有一个名为MyWidget 的类,内容是这样的:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    from PyQt4 import QtGui
    
    class MyWidget(QtGui.QWidget):
        def __init__(self, parent=None):
            super(MyWidget, self).__init__(parent)
    
            self.labelHello = QtGui.QLabel(self)
            self.labelHello.setText("This is My Widget")
    
            self.layout = QtGui.QHBoxLayout(self)
            self.layout.addWidget(self.labelHello)
    

【讨论】:

只是一个小评论:至少在我的安装中,库的完整文件路径不起作用。我不得不将其更改为 python 样式导入,然后效果很好!【参考方案2】:

您应该在QtDesigner 中放置一个QWidget,然后将其提升为您的自定义小部件。有关更多详细信息,请查看此链接:http://doc.qt.digia.com/qt/designer-using-custom-widgets.html

另一种选择是为您的小部件创建一个 QtDesigner 插件,但这仅在您需要放入多个用户界面时才有用。

【讨论】:

【参考方案3】:

好吧,目前没有更好的解决方案,我最终得到了一个 QVBoxLayout,其中一个单元格中有一个间隔:

FormClass, BaseClass = uic.loadUiType('main_window.ui')
assert BaseClass is QtGui.QMainWindow


class MainWindow(QtGui.QMainWindow, FormClass):

    def __init__(self):
        super().__init__()

        # uic adds a function to our class called setupUi
        # calling this creates all the widgets from the .ui file
        self.setupUi(self)

        # my custom widget
        self.web_view = WebView(self, WebPage(self, self.print_to_console))
        # replace placeholder with our widget
        self.placeholder_layout.takeAt(0)  # remove placeholder spacer
        # and replace it with our widget
        self.placeholder_layout.addWidget(self.web_view)

【讨论】:

以上是关于自定义小部件的占位符的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中呈现一个空视图?

自定义小部件无法转换为自定义小部件

自定义小部件的 Flutter 小部件测试失败

如何拖放自定义小部件?

Flutter 小部件包裹在自定义小部件中

如何设置自定义小部件的背景颜色和边框宽度?