Russian Qt Forum
Май 07, 2024, 07:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как в Qt создать функцию для работы с разными виджетами?  (Прочитано 5982 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Октябрь 27, 2014, 13:04 »

Здраствуйте, господа форумчаны. У меня вот появилась необходимость создать некую функцию, которая б принимала виджет, и уже определив что это за виджет производила бы определенные действия с ним. Но беда в том, что не могу пока понять как это сделать, ведь у каждого виджета свои параметры, свои методы. Может кто-то уже стыкался с данной проблемой? Буду рад советам по ее решению.
Записан
vulko
Гость
« Ответ #1 : Октябрь 27, 2014, 13:27 »

Способов куча. Зависит от того что нужно.

Ну например вот так можно...

Код:
enum WidgetType {
    WIDGET_0,
    WIDGET_1,
    WIDGET_2,
    WIDGET_3,
    WIDGET_4,
    WIDGET_5,
};

class QMyWidget : public QWidget {

...
private:
    WidgetType widgetType;

public:
    WidgetType getWidgetType() { return widgetType; }

}
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Октябрь 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
Записан

billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #3 : Октябрь 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),  для того, чтобы этот пример заработал.

Записан
vulko
Гость
« Ответ #4 : Октябрь 27, 2014, 16:01 »

Изучи как пользоваться layout'ми и не взрывай людям мозг Подмигивающий
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #5 : Октябрь 27, 2014, 16:14 »

layout-ами могу пользоваться, мне просто нужно понять как можно создать функцию, в которую бы можно было бы посылать любой виджет, а не виджет конкретного типа.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #6 : Октябрь 27, 2014, 16:19 »

А пример это так, чтобы люди могли понять, в чем был мой вопрос. Реальная задача, которая стоит передо мной намного сложнее. 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Октябрь 27, 2014, 16:27 »

Цитировать
Проблема состоит в том, что я не знаю что поставить вместо TypePar *parameter в функции show_wgt(TypePar *parameter, x, y, w, h),  для того, чтобы этот пример заработал.

Передавай QWidget a потом делай qobject_cast к нужному типу.

Код
C++ (Qt)
void MyClass::show_wgt(QWidget *w, x, y, w, h)
{
   if (qobject_cast<QLabel *>(w))
       qobject_cast<QLabel *>(w)->setText(lineName->text());
   else if (qobject_cast<QPushButton *>(w))
       qobject_cast<QPushButton *>(w)->setText(lineName->text());
 
   w->setStyleSheet("QWidget {background-color: red}");
   w->setGeometry(x, y, w, h);
   w->show();
}
 
void MyClass::set_showedWidget(){
   int x, y, w, h;
 
   x = 20;    y = 45;
   w = 70;    h = 25;
 
   QWidget *toShow = 0;
 
   if (qobject_cast<QLabel *>(sender()) {
       // do something
       toShow = new QLabel(this);
   } else if (qobject_cast<QPushButton *>(sender()) {
       // do something
       toShow = new QPushButton(this);
   } else {
       // wrong type
       return;
   }
 
   show_wgt(toShow , x, y, w, h);
}
 
« Последнее редактирование: Октябрь 27, 2014, 16:34 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #8 : Октябрь 27, 2014, 16:58 »

огромное спасибо) нужно попробовать)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 23.