Как автоматически изменить размер виджета qt?

Версия QT: 4.5.2 ОС: Ubuntu 8.04

У меня проблема с автоматическим изменением размера виджета, вот пример:

замещающий текст http://img15.imageshack.us/img15/3479/autoresize.png< /а>

Как показано на рисунке, здесь есть два виджета: один — «StrWidget» (верхний виджет на рисунке 1), который имеет 5 меток QLabel для отображения строк, другой — «CtrlWidget», который сообщает StrWidget, какую строку отображать.

Когда я нажимаю «отправить CCC», StrWidget становится виджетом, показанным на рисунке 2.

Но когда я снова нажимаю «отправить A», StrWidget становится виджетом, показанным на рисунке 3.

Существует функция-член StrWidget::changeString, которая является слотом StrWidget и получает строку для отображения.

void
StrWidget::changeString(QString inputStr)
{
    for(int i=0;i<5;i++){
        strEntries[i]->setText(inputStr);
    }
}

StrWidget не может автоматически изменять свой размер при вызове changeString. Я пробую следующие два метода:

(1) Вставьте «adjustSize()» в StrWidget::changeString, это работает, но мне нужно дважды щелкнуть кнопку, чтобы изменить ее размер. Я не знаю, почему это происходит.

(2) Вставьте "скрыть();показать();" в StrWidget::changeString это работает, но StrWidget сбрасывается, когда я нажимаю кнопки.

Кто-нибудь имеет представление об этом? Спасибо~


Ниже приведен исходный код примера

главный:

#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()));
}

person Sibevin Wang    schedule 12.01.2010    source источник
comment
Можешь перезалить картинку пожалуйста?   -  person MHDaouas    schedule 15.10.2014
comment
Извините, я не сохранил пока оригинальное изображение... и я также прошу помощи ImageShack, но они тоже извиняются...   -  person Sibevin Wang    schedule 30.10.2014


Ответы (1)


Вы могли бы попробовать

mainLayout->activate();

в changeString(). Это вынуждает переделывать макет. (Однако вам придется сделать mainLayout членом класса или, в качестве альтернативы, получить макет через layout()).

Кроме того, попробуйте добавить элементы управления с нулевым коэффициентом растяжения:

mainLayout->addWidget(strEntries[i], 0);
person balpha    schedule 12.01.2010
comment
Спасибо, балфа ~ Ваш ответ решает мой вопрос. Также спасибо за публикацию изображения :) - person Sibevin Wang; 13.01.2010
comment
@SibevinWang Изображение недоступно сейчас. - person John; 02.06.2021