Comment widget de redimensionnement automatique qt?
-
20-09-2019 - |
Question
Version QT: 4.5.2 OS: ubuntu 8.04
J'ai un problème avec widget redimensionnement automatique, voici un exemple:
texte alt http://img15.imageshack.us/img15/3479/autoresize .png
Comme le montre la figure, voici deux widgets, on est un « StrWidget » (le widget supérieur dans la figure 1), qui dispose de 5 QLabels pour montrer les cordes, l'autre est un « CtrlWidget » qui raconte StrWidget la chaîne à afficher .
Lorsque je clique sur "envoyer CCC", le StrWidget devient le widget indiqué sur la figure 2
Mais quand je cliquez à nouveau sur « envoyer un », le StrWidget devient le widget indiqué sur la figure 3
Il y a une fonction membre StrWidget :: changeString qui est une fente de StrWidget et de recevoir la chaîne pour montrer.
void
StrWidget::changeString(QString inputStr)
{
for(int i=0;i<5;i++){
strEntries[i]->setText(inputStr);
}
}
le StrWidget ne peut pas se redimensionner automatiquement lorsque changeString est appelé. J'essaie les deux méthodes suivantes:
(1) Insérer « AdjustSize () » dans StrWidget :: changeString, cela fonctionne, mais je dois cliquer sur un bouton deux fois pour faire redimensionnée. Je ne sais pas pourquoi il arrive.
(2) Insérer "hide (); show ();" dans StrWidget :: changeString, cela fonctionne, mais le StrWidget rougissait quand je clique sur les boutons.
Doser quelqu'un a une idée à ce sujet? Merci ~
Voici le code source de l'exemple
principal:
#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()));
}
La solution
Vous pouvez essayer
mainLayout->activate();
changeString()
. Cette la mise en page d'être refaite à neuf . (Vous devrez faire mainLayout
un membre de la classe si, ou bien obtenir la mise en page par layout()
).
En outre, essayez d'ajouter les commandes avec un facteur d'étirement de zéro:
mainLayout->addWidget(strEntries[i], 0);