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

gezeigt

Aber wenn ich wieder auf "A senden", wird die StrWidget das Widget in Abbildung 3

gezeigt

Es 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()));
}
War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top