qt - pyside2 - Marcador de posición para un widget personalizado
pyside vs pyqt (3)
Debe colocar un QWidget
en QtDesigner
y luego promoverlo en su widget personalizado. Para obtener más detalles, consulte este enlace: http://doc.qt.digia.com/qt/designer-using-custom-widgets.html
Otra opción sería crear un complemento QtDesigner para su widget, pero esto sería útil solo si necesita ubicarlo en múltiples uis.
Estoy cargando una base QMainWIndow de un archivo * .ui. Además, tengo un widget personalizado que quiero colocar en algún lugar del formulario. Actualmente puse en el archivo .ui un placeholder
nombrado QVBoxLayout
vacío, y en la subclase self.placeholder.addWidget(my_custom_widget)
hago self.placeholder.addWidget(my_custom_widget)
Lo único que no me gusta de este enfoque es que el diseño en blanco no tiene su propio tamaño. Puedo tener un diseño con una celda y con un widget ficticio ( QLabel
por ejemplo) con el tamaño que quiero, y reemplazar este widget y luego agregar mi widget personalizado, pero el método parece demasiado para mí.
¿Cuál es su enfoque para esa tarea?
Estoy usando Python (PyQt4)
Aquí hay un pequeño tutorial fácil sobre cómo promocionar un widget:
- Haga clic con el botón derecho en el widget que va a usar como marcador de posición y seleccione Promover a ....
- Complete los campos del diálogo emergente de Clases promocionadas :
- Nombre de clase base :
QWidget
en este caso. - Nombre de clase promocionado : el nombre de clase que utilizó para definir el widget para el que está creando el marcador de posición, aquí está
MyWidget
- Header File : /path/to/MyWidget.py es la ruta al archivo en el que se coloca
MyWidget
.
- Nombre de clase base :
- Una vez que haga clic en Agregar , la clase se creará y se mostrará, selecciónela y haga clic en
Promote
. Has terminado de promocionar. - Esto es lo que debe ver en el panel Inspector de Objetos , el nombre de la clase ya no es
QWidget
, sino que esMyWidget
. En el archivo en
/path/to/MyWidget.py
tengo una clase llamadaMyWidget
, y el contenido es algo como esto:#!/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)
Bueno, al no tener una mejor solución por el momento, terminé con un QVBoxLayout con una celda con un espaciador:
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)