Заполнитель для пользовательского виджета
Я загружаю базу QMainWIndow из файла *.ui. Кроме того, у меня есть пользовательский виджет, который я хочу разместить где-нибудь в форме. В настоящее время я вложил в .ui файл пустой QVBoxLayout
с именем placeholder
, а в подклассе QMainWindow do self.placeholder.addWidget(my_custom_widget)
Единственное, что мне не нравится в этом подходе, это то, что пустой макет не имеет собственного размера. Я могу иметь макет с одной ячейкой и с фиктивным виджетами (например, QLabel
) с размером, который я хочу, и заменить этот виджет, а затем добавить свой собственный виджет, но метод кажется слишком большим для меня.
Каков ваш подход к такой задаче?
Я использую Python (PyQt4)
Ответы
Ответ 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)