Cómo cambiar el tamaño de widget de auto-qt?
-
20-09-2019 - |
Pregunta
Versión QT: 4.5.2 OS: Ubuntu 8.04
Tengo un problema con widget de cambio de tamaño automático, aquí hay un ejemplo:
texto alternativo http://img15.imageshack.us/img15/3479/autoresize .png
Como muestra la figura, aquí hay dos widgets, uno es un "StrWidget" (el widget superior en la figura 1), que tiene 5 QLabels para mostrar las cadenas, el otro es un "CtrlWidget", que narra StrWidget qué cadena para mostrar .
Al hacer clic en "Enviar CCC", el StrWidget se convierte en el widget se muestra en la figura 2
Sin embargo, al hacer clic en "Enviar A" de nuevo, la StrWidget se convierte en el widget se muestra en la figura 3
No es una función miembro StrWidget :: changeString que es una ranura de StrWidget y recibir la cadena para mostrar.
void
StrWidget::changeString(QString inputStr)
{
for(int i=0;i<5;i++){
strEntries[i]->setText(inputStr);
}
}
la StrWidget no puede auto-cambiar el tamaño sí mismo cuando changeString se llama. Trato de los dos métodos siguientes:
(1) Insertar "adjustSize ()" en StrWidget :: changeString, funciona pero necesito hacer clic en un botón dos veces para hacerla cambiar de tamaño. No sé por qué sucede.
(2) Insertar "ocultar (); show ();" en StrWidget :: changeString, funciona pero el StrWidget se podía tirar al hacer clic en los botones.
Dosis Alguien tiene una idea al respecto? Gracias ~
El siguiente es el código fuente del ejemplo
principal:
#include "StrWidget.h"
#include "CtrlWidget.h"
#include <QApplication>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
StrWidget *strWidget=new StrWidget(0);
CtrlWidget *ctrlWidget=new CtrlWidget(0);
strWidget->show();
ctrlWidget->show();
QObject::connect(ctrlWidget,SIGNAL(sendString(QString)),strWidget,SLOT(changeString(QString)));
int ref=app.exec();
strWidget->deleteLater();
ctrlWidget->deleteLater();
return ref;
}
StrWidget.h
#include <QWidget>
#include <QString>
#include <QLabel>
#ifndef _StrWidget_H_
#define _StrWidget_H_
class StrWidget:public QWidget
{
Q_OBJECT
public:
StrWidget(QWidget *parent=0);
private:
QLabel *strEntries[5];
public slots:
void changeString(QString inputStr);
void clearString();
};
#endif
StrWidget.cpp
#include "StrWidget.h"
#include <QPushButton>
#include <QHBoxLayout>
StrWidget::StrWidget(QWidget *parent):QWidget(parent)
{
//main layout
QHBoxLayout *mainLayout=new QHBoxLayout(this);
setLayout(mainLayout);
//info label setup
for(int i=0;i<5;i++){
strEntries[i]=new QLabel(this);
strEntries[i]->setText("A");
strEntries[i]->setFrameShape(QFrame::StyledPanel);
mainLayout->addWidget(strEntries[i]);
}
//clearBtn setup
QPushButton *clearBtn=new QPushButton(tr("Clear Str"),this);
connect(clearBtn,SIGNAL(clicked()),this,SLOT(clearString()));
mainLayout->addWidget(clearBtn);
}
void
StrWidget::changeString(QString inputStr)
{
for(int i=0;i<5;i++){
strEntries[i]->setText(inputStr);
}
}
void
StrWidget::clearString()
{
changeString("");
}
CtrlWidget.h
#include <QWidget>
#include <QString>
#ifndef _CtrlWidget_H_
#define _CtrlWidget_H_
class CtrlWidget:public QWidget
{
Q_OBJECT
public:
CtrlWidget(QWidget *parent=0);
signals:
void sendString(QString sentStr);
};
CtrlWidget.cpp
#include "CtrlWidget.h"
#include <QHBoxLayout>
#include <QPushButton>
#include <QSignalMapper>
CtrlWidget::CtrlWidget(QWidget *parent):QWidget(parent)
{
//main layout
QHBoxLayout *mainLayout=new QHBoxLayout(this);
setLayout(mainLayout);
//control btns setup
QPushButton *sendABtn=new QPushButton("send A",this);
QPushButton *sendBBBtn=new QPushButton("send BB",this);
QPushButton *sendCCCBtn=new QPushButton("send CCC",this);
mainLayout->addWidget(sendABtn);
mainLayout->addWidget(sendBBBtn);
mainLayout->addWidget(sendCCCBtn);
//map setup
QSignalMapper *btnMapper=new QSignalMapper(this);
btnMapper->setMapping(sendABtn,"A");
btnMapper->setMapping(sendBBBtn,"BB");
btnMapper->setMapping(sendCCCBtn,"CCC");
connect(btnMapper,SIGNAL(mapped(QString)),this,SIGNAL(sendString(QString)));
//connection setup
connect(sendABtn,SIGNAL(clicked()),btnMapper,SLOT(map()));
connect(sendBBBtn,SIGNAL(clicked()),btnMapper,SLOT(map()));
connect(sendCCCBtn,SIGNAL(clicked()),btnMapper,SLOT(map()));
}
Solución
Usted podría intentar
mainLayout->activate();
en changeString()
. obliga al diseño para ser rehecho . (Vas a tener que hacer mainLayout
un miembro de la clase sin embargo, o, alternativamente, de obtener la distribución a través layout()
).
Además, trate de la adición de los controles con un factor de estiramiento de cero:
mainLayout->addWidget(strEntries[i], 0);