Название: Как в Qt создать функцию для работы с разными виджетами? Отправлено: billy4685 от Октябрь 27, 2014, 13:04 Здраствуйте, господа форумчаны. У меня вот появилась необходимость создать некую функцию, которая б принимала виджет, и уже определив что это за виджет производила бы определенные действия с ним. Но беда в том, что не могу пока понять как это сделать, ведь у каждого виджета свои параметры, свои методы. Может кто-то уже стыкался с данной проблемой? Буду рад советам по ее решению.
Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: vulko от Октябрь 27, 2014, 13:27 Способов куча. Зависит от того что нужно.
Ну например вот так можно... Код: enum WidgetType { Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: gil9red от Октябрь 27, 2014, 14:25 Виджеты наследуются от QObject, поэтому можно попробовать рефлексию:
Например назначать имя объекту виджета: http://qt-project.org/doc/qt-4.8/qobject.html#objectName-prop Или задавать собственное свойство, например тип виджета: http://qt-project.org/doc/qt-4.8/qobject.html#setProperty Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: billy4685 от Октябрь 27, 2014, 15:55 Дело в том,что я хочу создать функцию, у которой в качестве входного параметра был бы некий объект или указатель на объект, вместо которого, вызывая эту функцию можно было бы посылать в нее к примеру кнопку, или простой виджет, или же поле. Давайте я на небольшом примере обрисую вам, то что я хочу сделать:
// ----- main.cpp ----- #include "myclass.h" #include <QTextCodec> int main(int argc,char *argv[]) { QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8""")); QApplication app(argc,argv); MyClass mycl; mycl.show(); return app.exec(); } //------myclass.h--------- #ifndef MYCLASS_H #define MYCLASS_H #include <QtGui> #include <QDialog> class MyClass : public QDialog{ Q_OBJECT public: MyClass(QWidget *parent=0); void show_wgt(TypePar *parameter, x, y, w, h); public slots: void set_showedWidget(); private: QLineEdit *lineName; QLabel *nameObject; QPushButton *showWidget; QPushButton *close; int size_w; int size_h; }; #endif // MYCLASS_H // ---------myclass.cpp------- #include "myclass.h" MyClass::MyClass(QWidget *parent) :QDialog(parent){ size_w = 400; size_h = 400; setFixedSize(size_w, size_h); setWindowTitle("Создание разных типов виджетов"); int x, y, w, h; x = 40; y = 8; w = 100; h = 25; nameObject = new QLabel(this); nameObject->setText("gdggb"); nameObject->setGeometry(x, y, w, h); x = 110; y = 45; w = 90; h = 25; lineName = new QLineEdit(this); lineName->setText(""); lineName->setGeometry(x, y, w, h); x = 210; y = 10; w = 90; h = 28; showWidget = new QPushButton(this); showWidget->setText("Показать"); showWidget->setGeometry(x, y, w, h); connect(showWidget, SIGNAL(clicked()), this, SLOT(set_showedWidget())); x = 210; y = 45; w = 90; h = 28; close = new QPushButton(this); close->setText("Выйти"); close->setGeometry(x, y, w, h); connect(close, SIGNAL(clicked()), this, SLOT(close())); } void MyClass::set_showedWidget(){ int x, y, w, h; x = 20; y = 45; w = 70; h = 25; if(lineName->text() == "QWidget"){ nameObject->setText("QWidget"); QWidget *wgt1 = new QWidget(this); show_wgt(wgt1, x, y, w, h); } else if(lineName->text() == "QLabel"){ nameObject->setText("QLabel"); QLabel *wgt2 = new QLabel(this); show_wgt(wgt2, x, y, w, h); } else if(lineName->text() == "QPushButton"){ nameObject->setText("QPushButton"); QPushButton *wgt3 = new QPushButton(this); show_wgt(wgt3, x, y, w, h); } else nameObject->setText("не тот тип"); } void MyClass::show_wgt(TypePar *parameter, x, y, w, h){ if(parameter->metaObject == "QWidget") parameter->setStyleSheet("QWidget {background-color: red}"); if(parameter->metaObject == "QLabel") parameter->setText(lineName->text()); if(parameter->metaObject == "QPushButton") parameter->setText(lineName->text()); parameter->setGeometry(x, y, w, h); parameter->show(); } Проблема состоит в том, что я не знаю что поставить вместо TypePar *parameter в функции show_wgt(TypePar *parameter, x, y, w, h), для того, чтобы этот пример заработал. Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: vulko от Октябрь 27, 2014, 16:01 Изучи как пользоваться layout'ми и не взрывай людям мозг ;)
Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: billy4685 от Октябрь 27, 2014, 16:14 layout-ами могу пользоваться, мне просто нужно понять как можно создать функцию, в которую бы можно было бы посылать любой виджет, а не виджет конкретного типа.
Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: billy4685 от Октябрь 27, 2014, 16:19 А пример это так, чтобы люди могли понять, в чем был мой вопрос. Реальная задача, которая стоит передо мной намного сложнее.
Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: kuzulis от Октябрь 27, 2014, 16:27 Цитировать Проблема состоит в том, что я не знаю что поставить вместо TypePar *parameter в функции show_wgt(TypePar *parameter, x, y, w, h), для того, чтобы этот пример заработал. Передавай QWidget a потом делай qobject_cast к нужному типу. Код
Название: Re: Как в Qt создать функцию для работы с разными виджетами? Отправлено: billy4685 от Октябрь 27, 2014, 16:58 огромное спасибо) нужно попробовать)
|