gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:23:50 26 4
gpt4 key购买 nike

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

我在自动调整小部件时遇到问题,这是一个示例:

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

如图所示,这里有两个小部件,一个是“StrWidget”(图1中的上部小部件),它有5个QLabels用于显示字符串,另一个是“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);
}
}

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

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

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

控件小部件.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);
};

控件控件.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() 获取布局)。

此外,尝试添加拉伸(stretch)因子为零的控件:
mainLayout->addWidget(strEntries[i], 0);

关于qt - 如何自动调整 qt 小部件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2048610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com