QLabel no se muestra en QWidget

Resuelto Laurent Crivello asked hace 6 años • 2 respuestas

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?

Laurent Crivello avatar Feb 05 '18 02:02 Laurent Crivello
Aceptado

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.

eyllanesc avatar Feb 04 '2018 21:02 eyllanesc

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 chatWidgetcomo elemento secundario en centralWidgetel 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();
}
Mohammad Kanan avatar Feb 04 '2018 21:02 Mohammad Kanan