如何自动调整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()));
}
你可以尝试
mainLayout->activate();
在changeString()
。那forces the layout to be redone。 (不过,您必须让mainLayout
成为班级成员,或者通过layout()
获得布局)。
此外,尝试零伸展因子添加控件:
mainLayout->addWidget(strEntries[i], 0);
谢谢你,balpha〜 你的回答解决了我的问题。 也感谢张贴图片:) – 2010-01-13 02:32:26
你能重新上传的图片吗? – MHDaouas 2014-10-15 13:09:59
对不起,我现在没有保留原始图像...我也向ImageShack寻求帮助,但他们也说对不起...... – 2014-10-30 01:58:30