Подтвердить что ты не робот

Заполнитель для пользовательского виджета

Я загружаю базу QMainWIndow из файла *.ui. Кроме того, у меня есть пользовательский виджет, который я хочу разместить где-нибудь в форме. В настоящее время я вложил в .ui файл пустой QVBoxLayout с именем placeholder, а в подклассе QMainWindow do self.placeholder.addWidget(my_custom_widget)

Единственное, что мне не нравится в этом подходе, это то, что пустой макет не имеет собственного размера. Я могу иметь макет с одной ячейкой и с фиктивным виджетами (например, QLabel) с размером, который я хочу, и заменить этот виджет, а затем добавить свой собственный виджет, но метод кажется слишком большим для меня.

Каков ваш подход к такой задаче?

Я использую Python (PyQt4)

4b9b3361

Ответ 1

Вот небольшой учебник по продвижению виджета:

  • Щелкните правой кнопкой мыши виджет, который вы собираетесь использовать в качестве заполнителя, и выберите Содействовать....

    Image Promote

  • Заполните поля диалогового окна "Продвинутые клады":
    • Имя базового класса: QWidget в этом случае.
    • Имя продвигаемого класса. Имя класса, которое вы использовали для определения виджета, для которого вы создаете местозаполнитель, здесь MyWidget
    • Файл заголовка:/path/to/MyWidget.py - это путь к файлу, в который помещается MyWidget. Image Path
  • Как только вы нажмете Добавить, класс будет создан и отображен, выберите его и нажмите Promote. Вы закончили продвижение. Image Add
  • Вот что вы должны увидеть на панели Object Inspector, имя класса больше не QWidget, а MyWidget.

    Image Promoted

  • В файле /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)
    

Ответ 2

Вы должны поместить QWidget в QtDesigner, а затем продвинуть его в свой пользовательский виджет. Для получения дополнительной информации проверьте эту ссылку: http://doc.qt.digia.com/qt/designer-using-custom-widgets.html

Другим вариантом было бы создать плагин QtDesigner для вашего виджета, но это было бы полезно, только если вам нужно поместить его в несколько uis.

Ответ 3

Ну, не имея лучшего решения на данный момент, я закончил QVBoxLayout с одной ячейкой с разделителем в ней:

enter image description here

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)