Я использую Qt 4.7.0 и Windows7, у меня огромная проблема с пользовательскими виджетами, я основал пользовательский виджет QLed, я его использую.
Я хочу добавить свойства сигнала в виджет QLed и вВремя разработки с QtDesigner. Я хочу добавить 100 QLed в мой Ui-файл и установить для каждого свойства сигнала каждого QLed число (тип свойств сигнала не важен), поэтому я хочу получить доступ к этим 100 QLed, когда я кодирую и создаю QList иполучить доступ к этим
QFile file(":/test.ui");
QUiLoader loader;
file.open(QFile::ReadOnly);
QWidget *formWidget = loader.load(&file, this);
file.close();
formWidget->show();
QList<QLed *> allQLed = formWidget->findChildren<QLed *>();
теперь я хочу отправить данные в QLeds
for(int i=0; i<allQLed.size(); i++){
if(allQLed.at(i)->SIGNAL_PROPERTIES == 123)
allQLed.at(i)->setValue(true);
else
allQLed.at(i)->setValue(false);
}
теперь он будет включать все QLeds, что SIGNAL_PROPERTIES == 123
- это моя теория и методили я могу поступить иначе?я написал свою проблему шаг за шагом я изменил dialog.cpp и cunstructor Dialog :: Dialog (QWidget * parent): и * .pro файл, который я прикрепил к моей тестовой программе.Спасибо.
*. Pro файл:
TARGET = example
TEMPLATE = app
QT += svg
CONFIG += uitools
SOURCES += main.cpp\
dialog.cpp\
HEADERS += dialog.h\
qled.h
FORMS += dialog.ui
LIBS += libqledplugin
RESOURCES = test.qrc
** dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QFileDialog>
#include <QtUiTools>
#include "QLed.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//---------------------------------------------------------------
QFile file(":/test.ui");
QUiLoader loader;
file.open(QFile::ReadOnly);
QWidget *formWidget = loader.load(&file, this);
file.close();
formWidget->show();
qDebug() << formWidget->children();
QList<QCheckBox *> allCheckBox = formWidget->findChildren<QCheckBox *>();
qDebug() << allCheckBox;
qDebug() << allCheckBox.size();
allCheckBox.at(2)->setChecked(true);
QCheckBox *hello1 = formWidget->findChild<QCheckBox *>("checkBox_2");
qDebug() << hello1;
hello1->setChecked(true);
QList<QLed *> allQLed = formWidget->findChildren<QLed *>();
qDebug() << allQLed;
qDebug() << allQLed.size();
QLed *led = formWidget->findChild<QLed *>("qLed");
qDebug() << led;
//---------------------------------------------------------------
}
Я скопировал файлы папки qledplugin-build-desktop \ release: qledplugin.dll, libqledplugin.a, moc_qled.cpp, moc_qledplugin.cpp, qrc_qled.cpp, moc_qled.o, moc_qledplugin.o, qled.o, qledplugin.o, qrc_qled.o,
до: 10: 101022 *
, я могу создать Ui-диалог с QtDesigner и размещать QLeds и QLabels, все хорошо, а также я могу использовать другие виджеты.после этого я хочу показать этот Ui-файл в моей программе, я использую UiLoader, загружаю UI-файл в объект QWidget QWidget * formWidget = loader.load (& file, this);и .show () это, во время компиляции я получаю это предупреждение в 1) вкладка Build Issues:
release/moc_qled.cpp:75: warning: 'QLed::staticMetaObject' redeclared without dllimport attribute after being referenced with dll linkage
release/moc_qled.cpp:84: warning: 'virtual const QMetaObject* QLed::metaObject() const' redeclared without dllimport attribute: previous dllimport ignored
release/moc_qled.cpp:89: warning: 'virtual void* QLed::qt_metacast(const char*)' redeclared without dllimport attribute: previous dllimport ignored
release/moc_qled.cpp:97: warning: 'virtual int QLed::qt_metacall(QMetaObject::Call, int, void**)' redeclared without dllimport attribute: previous dllimport ignored
но моя программа работает.все хорошо, и мой созданный файл загружается.я использую эту команду:
qDebug() << formWidget->children();
, и я могу видеть в 3) Вкладка «Вывод приложения»:
Starting C:\QledTEST\my test program\mytest-build-desktop\release\example.exe...
(QFormInternal::TranslationWatcher(0x14683d8) , QLed(0x1472320, name = "qLed_2") , QLed(0x14722a0, name = "qLed_3") , QLed(0x14723a0, name = "qLed_4") , QCheckBox(0x14810b8, name = "checkBox_2") , QCheckBox(0x14810d8, name = "checkBox_3") , QCheckBox(0x14810f8, name = "checkBox_4") , QLabel(0x1481118, name = "label") , QCheckBox(0x1481138, name = "checkBox") , QLed(0x14724e0, name = "qLed") )
C:\QledTEST\my test program\mytest-build-desktop\release\example.exe exited with code 0
, чтобы я мог видеть детей formWidget, который содержит QLeds, мои пользовательские виджеты.
теперь мне нужно отправить данные в мои QLeds и QCheckBoxs, я создаю QList и пробую его:
QList<QCheckBox *> allCheckBox = formWidget->findChildren<QCheckBox *>();
qDebug() << allCheckBox;
qDebug() << allCheckBox.size();
allCheckBox.at(2)->setChecked(true); // i can send data
QCheckBox *hello1=formWidget->findChild<QCheckBox*>("checkBox_2");
qDebug() << hello1;
hello1->setChecked(true);// i can send data
я получаю:
(QCheckBox(0x14e10b8, name = "checkBox_2") , QCheckBox(0x14e10d8, name = "checkBox_3") , QCheckBox(0x14e10f8, name = "checkBox_4") , QCheckBox(0x14e1138, name = "checkBox") )
4
QCheckBox(0x6f10b8, name = "checkBox_2")
он показывает 4 QCheckBox
теперь я пытаюсь использовать пользовательский виджет:
QList<QLed *> allQLed = formWidget->findChildren<QLed *>();
qDebug() << allQLed;
qDebug() << allQLed.size();
я получаю:
()
0
QObject(0x0) //null pointer
моя огромная проблема здесь: allQLed.size () равен нулю, и я получаю нулевые указатели
если я добавляю виджет QLed с кодировкой, у меня нет проблем, НО мне нужен QtDesigner.
Я тестировал это на Q3Frame, это подключаемый модуль виджетов в QtDesigner и та же проблема.
почему это произошло и что я могу сделать?Qt не могу это сделать?
заранее спасибо, ура