QLabel no se muestra en QWidget
Tengo la siguiente jerarquía en mi aplicación Qt: QMainWindow > QWidget (centralWidget) > QWidget (subclase) > QLabel
Código de inicialización en mi código QMainWindow:
centralWidget = new QWidget();
centralWidget->setGeometry(0,0,width,height);
chatWidget=new ChatWidget(this); // the subclassed QWidget
setCentralWidget(centralWidget);
En mi inicialización de QWidget subclasificada (que ocurre al mismo tiempo que la inicialización de la aplicación Qt) tengo el siguiente código:
ChatWidget::ChatWidget(QWidget *parent):QWidget(parent)
{
QLabel *lbl;
lbl=new QLabel(this);
lbl->setText("Hello World 1"); <-- Is properly Display
}
void ChatWidget::displayChatAfterButtonPressed()
{
QLabel *lbl;
lbl=new QLabel(this);
lbl->setText("Hello World 2"); <-- Does NOT appear
}
Cuando se agrega QLabel desde la inicialización de la clase, el mensaje se muestra bien en el widget.
Sin embargo, cuando ejecuto el mismo código después de presionar un botón (a través de una función en la misma subclase de QWidget), el texto no aparece en la pantalla.
No quiero utilizar diseños porque necesito colocar exactamente mis etiquetas.
Intenté volver a pintar, pero tampoco ayudó.
¿Cómo puedo mostrar una etiqueta de forma adecuada y dinámica una vez finalizada la inicialización?
Los widgets, cuando son visibles por primera vez, llaman a ser visibles para sus hijos, pero como los crea después, probablemente no estén llamando a ese método, una posible solución es llamar al método show.
void ChatWidget::displayChatAfterButtonPressed()
{
QLabel *lbl;
lbl=new QLabel(this);
lbl->setText("Hello World 2");
lbl->show();
}
comentario: me parece extraño que al QMainWindow le pongas un widget central y luego crees el chatWidget como padre del QMainWindow, generalmente no se recomienda agregar hijos al QMainWindow porque tiene una estructura determinada, lo que se debe hacer es para colocarlo dentro del widget central.
Necesitamos mostrar la etiqueta creada al hacer clic en el botón, porque el widget central ya estaba pintado. Aquí hay un ejemplo funcional, agregué esto como respuesta y también noté que es mejor agregarlo chatWidget
como elemento secundario en centralWidget
el lugar donde en su código original se agrega a la interfaz de usuario... esta es su elección.
Ventana principal:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//
ui->setupUi(this);
centralWidget = new QWidget();
centralWidget->setGeometry(width,height);
chatWidget=new ChatWidget(centralWidget); // the subclassed QWidget
setCentralWidget(centralWidget);
// added testing
QPushButton *btn = new QPushButton("MyButton",centralWidget);
btn->setGeometry(100,100,100,100);
btn->setMaximumSize(100,100);
connect(btn,&QPushButton::clicked, chatWidget, &ChatWidget::displayChatAfterButtonPressed);
}
y widget de chat:
ChatWidget::ChatWidget(QWidget *parent):QWidget(parent)
{
QLabel *lbl;
lbl=new QLabel(this);
lbl->setText("Hello World 1");
}
void ChatWidget::displayChatAfterButtonPressed()
{
QLabel *lbl;
lbl=new QLabel(this);
lbl->setText("Hello World 2");
lbl->show();
}