2010-01-12 9 views
4

QT Version: 4.5.2 OS: ubuntu 8.04Comment redimensionner automatiquement le widget qt?

J'ai un problème avec widget redimensionnement automatique, voici un exemple:

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

Comme le montre la figure, voici deux widgets , un est un "StrWidget" (le widget supérieur de la figure 1) qui a 5 QLabels pour montrer les chaînes, l'autre est un "CtrlWidget" qui indique à StrWidget quelle chaîne afficher.

Lorsque je clique sur « envoyer CCC », le StrWidget devient le widget indiqué sur la figure 2

Mais quand je clique sur « envoyer un » nouveau, le StrWidget devient le widget indiqué sur la figure 3

Il est une fonction membre StrWidget :: changeString qui est un slot de StrWidget et reçoit la chaîne pour l'affichage.

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

le StrWidget ne peut pas automatiquement redimensionner lui-même quand changeString est appelé. J'essaie les deux méthodes suivantes:

(1) Insérer "adjustSize()" dans StrWidget :: changeString, cela fonctionne mais j'ai besoin de cliquer deux fois sur un bouton pour le redimensionner. Je ne sais pas pourquoi ça arrive.

(2) Insérer "hide(); show();" dans StrWidget :: changeString, ça marche mais le StrWidget se vide quand je clique sur les boutons.

Dose quelqu'un a une idée à ce sujet? Merci ~


Ce qui suit est 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())); 
} 
+0

Pouvez-vous re-télécharger l'image s'il vous plaît? – MHDaouas

+0

Désolé, je n'ai pas gardé l'image originale pour l'instant ... et je demande aussi à ImageShack de m'aider, mais ils disent désolé aussi ... –

Répondre

5

Vous pouvez essayer

mainLayout->activate(); 

dans changeString(). Cela forces the layout to be redone. (Vous devrez faire mainLayout un membre de classe, ou bien obtenir la mise en page par layout()).

Aussi, essayez d'ajouter les commandes avec un facteur d'étirement de zéro:

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

Merci, balpha ~ Votre réponse résout ma question. Aussi merci d'avoir posté l'image :) –