سؤال

Qt الإصدار: 4.5.2 نظام التشغيل: Ubuntu 8.04

لدي مشكلة مع عنصر واجهة المستخدم التلقائي، إليك مثال:

النص البديل http://img15.imageshack.us/img15/3479/autoresize.png.

نظرا لأن الرقم يظهر، فيما يلي عنصران عملان، واحد هو "StrWidget" (القطعة العليا في الشكل 1) الذي يحتوي على 5 QLabels لإظهار السلاسل، والآخر هو "Ctrlwidget" الذي يروي Strwidget ما هي السلسلة التي تظهر.

عندما أضغط على "إرسال CCC"، تصبح StrWIDGET هي القطعة المعروضة في الشكل 2

ولكن عندما انقر فوق "إرسال A" مرة أخرى، تصبح StrWIDGET هي القطعة المعروضة في الشكل 3

هناك وظيفة عضو Strwidget :: ENGURTRING والتي هي فتحة من Strwidget واستلم السلسلة للعرض.

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

لا يمكن ل Strwidget تغيير حجمها تلقائيا عند استدعاء الإثارة. أحاول الطرق التالية:

(1) إدراج "ضبط ()" في Strwidget :: ENGURTRING، فإنه يعمل، لكنني بحاجة إلى النقر فوق زر مرتين لتغيير حجمه. أنا لا أعرف لماذا يحدث ذلك.

(2) إدراج "إخفاء ()؛ إظهار ()؛" في Strwidget :: ENGAGESTRING، فإنه يعمل، لكن 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()).

أيضا، حاول إضافة عناصر التحكم مع عامل تمتد من الصفر:

mainLayout->addWidget(strEntries[i], 0);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top