문제

QT 버전 : 4.5.2 OS : Ubuntu 8.04

자동 재조정 위젯에 문제가 있습니다. 예를 들어 있습니다.

Alt Text http://img15.imageshack.us/img15/3479/autoresize.png

그림에서 알 수 있듯이 여기에는 두 개의 위젯이 있습니다. 하나는 문자열을 보여주기위한 5 개의 qlabels가있는 "strwidget"(그림 1의 상단 위젯)이며, 다른 하나는 "ctrlwidget"으로 strwidget에게 표시 할 문자열을 알려줍니다.

"CCC 보내기"를 클릭하면 strwidget이 그림 2에 표시된 위젯이됩니다.

그러나 "A Send a"를 다시 클릭하면 strwidget이 그림 3에 표시된 위젯이됩니다.

strwidget의 슬롯 인 멤버 함수 strwidget :: Changestring이 있습니다.

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

Changestring이 호출 될 때 strwidget 자체를 자동으로 표시 할 수 없습니다. 다음 두 가지 방법을 시도합니다.

(1) strwidget :: Changestring에 "Adjectsize ()"삽입이 작동하지만 버튼을 두 번 클릭하여 크기를 조정해야합니다. 왜 그런 일이 발생하는지 모르겠습니다.

(2) "hide (); show ();"삽입 strwidget :: Changestring에서는 작동하지만 버튼을 클릭하면 strwidget이 플러시됩니다.

누구든지 그것에 대해 아이디어가 있습니까? 감사합니다 ~


다음은 예제의 소스 코드입니다

기본:

#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()));
}
도움이 되었습니까?

해결책

당신은 시도 할 수 있습니다

mainLayout->activate();

안에 changeString(). 저것 레이아웃을 다시 작성하도록합니다. (당신은 만들어야합니다 mainLayout 그래도 클래스 멤버, 또는 또는 또는 레이아웃을 통해 layout()).

또한 스트레치 계수가 0 인 컨트롤을 추가하십시오.

mainLayout->addWidget(strEntries[i], 0);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top