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

问题描述:

QT版本:4.5.2 操作系统:Ubuntu的8.04如何自动调整qt小部件大小?

我有自动调整窗口小部件的故障,这里有一个例子:

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

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

当我点击“发送CCC”,该StrWidget成为图2

所示的组件,但是当我点击“发送”一遍,StrWidget成为图所示的窗口小部件3

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

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

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

(1)将“adjustSize()”插入到StrWidget :: changeString中,它可以工作,但我需要单击两次按钮才能调整大小。我不知道为什么会发生。 (2)插入“hide(); show();”在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())); 
} 
+0

你能重新上传的图片吗? – MHDaouas 2014-10-15 13:09:59

+0

对不起,我现在没有保留原始图像...我也向ImageShack寻求帮助,但他们也说对不起...... – 2014-10-30 01:58:30

你可以尝试

mainLayout->activate(); 

changeString()。那forces the layout to be redone。 (不过,您必须让mainLayout成为班级成员,或者通过layout()获得布局)。

此外,尝试零伸展因子添加控件:

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

谢谢你,balpha〜 你的回答解决了我的问题。 也感谢张贴图片:) – 2010-01-13 02:32:26