Wie man Auto-Resize-qt-Widget?
-
20-09-2019 - |
Frage
QT Version: 4.5.2 OS: Ubuntu 8.04
Ich habe ein Problem mit Auto-Größenänderung Widget, hier ein Beispiel:
alt text http://img15.imageshack.us/img15/3479/autoresize .png
Wie die Abbildung zeigt, sind hier zwei Widgets, ist man ein „StrWidget“ (die obere Widget in der Abbildung 1), die für die Ansicht Saiten 5 QLabels hat, der andere ein „CtrlWidget“ ist die StrWidget welche Zeichenfolge Show erzählt .
Als ich "send CCC" klicken, wird der StrWidget das Widget in Abbildung 2
gezeigtAber wenn ich wieder auf "A senden", wird die StrWidget das Widget in Abbildung 3
gezeigtEs gibt eine Memberfunktion StrWidget :: changeString, die einen Schlitz von StrWidget ist und erhalten Sie die Zeichenfolge für die Ansicht.
void
StrWidget::changeString(QString inputStr)
{
for(int i=0;i<5;i++){
strEntries[i]->setText(inputStr);
}
}
die StrWidget kann sich nicht automatisch die Größe, wenn changeString genannt wird. Ich versuche, die folgenden zwei Methoden:
(1) Einfügen „AdjustSize ()“ in StrWidget :: changeString, es funktioniert, aber ich brauche eine Taste zweimal klicken, um es der Größe verändert zu machen. Ich weiß nicht, warum es passiert.
(2) Einfügen "hide (); Show ();" in StrWidget :: changeString, es funktioniert, aber die StrWidget würde spülen, wenn ich Schaltflächen klicken.
Dose jemand eine Idee davon haben? Dank ~
Im Folgenden ist der Quellcode des Beispiels
Haupt:
#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()));
}
Lösung
Sie könnten versuchen,
mainLayout->activate();
in changeString()
. Dass Kräfte das Layout nochmals gemacht sein. (Sie werden mainLayout
ein Klassenmitglied obwohl, oder alternativ erhalten Sie das Layout durch layout()
machen müssen).
Versuchen Sie auch, die Kontrollen mit einem Streckfaktor von Null hinzu:
mainLayout->addWidget(strEntries[i], 0);