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()));
}
Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top