سؤال
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);