如何自动调整qt小部件大小?

4

QT版本:4.5.2 操作系统:Ubuntu 8.04

我在自动调整小部件方面遇到了问题,以下是一个例子:

alt text http://img15.imageshack.us/img15/3479/autoresize.png

如图所示,这里有两个小部件,一个是“StrWidget”(图1中的上面的小部件),它有5个QLabel用于显示字符串,另一个是“CtrlWidget”,它告诉StrWidget要显示哪个字符串。

当我点击“send CCC”时,StrWidget变成了图2中显示的小部件

但是当我再次点击“send A”时,StrWidget变成了图3中显示的小部件

StrWidget有一个成员函数StrWidget::changeString,它是StrWidget的槽,用于接收要显示的字符串。

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

当调用changeString时,StrWidget无法自动调整大小。我尝试了以下两种方法:

(1) 在StrWidget::changeString中插入"adjustSize()",它可以工作,但需要点击两次按钮才能使其调整大小。我不知道为什么会这样。

(2) 在StrWidget::changeString中插入"hide();show();",它可以工作,但是当我点击按钮时,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()));
}

请问您可以重新上传这张图片吗? - MHDaouas
抱歉,我现在没有保留原始图像... 我也向ImageShack寻求帮助,但他们也说抱歉... - Sibevin Wang
1个回答

5

您可以尝试

mainLayout->activate();

changeString()中。这会强制重新布局。(你需要将mainLayout作为类成员,或通过layout()获取布局)。

另外,尝试使用零的拉伸因子添加控件:

mainLayout->addWidget(strEntries[i], 0);

谢谢你,balpha~ 你的答案解决了我的问题。 同时感谢你发布了图片 :) - Sibevin Wang
@SibevinWang 现在无法访问该图片。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接