14

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

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

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

我正在使用 Python (PyQt4)

4

3 回答 3

29

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

  1. 右键单击要用作占位符的小部件,然后选择提升为...。

    形象宣传

  2. 填写“ Promoted Classes”弹出对话框字段:
    • 基类名称QWidget在这种情况下。
    • 提升类名称:您用于定义要为其创建占位符的小部件的类名称,这里是MyWidget
    • 头文件/path/to/MyWidget.pyMyWidget是放置文件的路径。图像路径
  3. 单击Add后,将创建并显示该类,选择它并单击Promote。你已经完成了推广。图片添加
  4. 这是您应该在Object Inspector面板中看到的内容,类的名称不再是QWidgetMyWidget而是。

    形象提升

  5. 在文件中,/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)
    
于 2013-01-26T18:50:18.180 回答
4

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

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

于 2013-01-23T13:54:30.310 回答
2

好吧,目前没有更好的解决方案,我最终得到了一个 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)
于 2013-01-26T06:18:11.830 回答