Russian Qt Forum

Qt => Общие вопросы => Тема начата: igorko от Июнь 15, 2006, 21:52



Название: Как узнать к какому классу относится QWidget*
Отправлено: igorko от Июнь 15, 2006, 21:52
Здравствуйте все!

Хочу назаписывать в QList<QWidget*> указателей на разные widget-ы
(QLineEdit-ы, QTextEdit-ы, QComboBox-ы, ...), а потом вызывать методы соответствующие для классов.

Например для lineEdit->setText(...)
для textEdit->setPlainText(...)
для comboBox->addItem(...)

Как это правильно делать?

Спасибо!


Название: Re: Как узнать к какому классу относится QWidget*
Отправлено: QCasper от Июнь 15, 2006, 23:10
Цитата: "igorko"
Здравствуйте все!

Хочу назаписывать в QList<QWidget*> указателей на разные widget-ы
(QLineEdit-ы, QTextEdit-ы, QComboBox-ы, ...), а потом вызывать методы соответствующие для классов.

Например для lineEdit->setText(...)
для textEdit->setPlainText(...)
для comboBox->addItem(...)

Как это правильно делать?

Спасибо!


ну типа:

Код:
QList<QWidget*> lw;
(reinterpret_cast<QLineEdit*>(lw[0]))->setText();


если ты конечно твердо уверен, что нулевой это QLineEdit и в том духе


Название: Как узнать к какому классу относится QWidget*
Отправлено: AlexKiriukha от Июнь 16, 2006, 01:29
Сам не пробовал, но нашел в документации к 4.1.0 такую информацию:
Цитировать

bool QObject::inherits ( const char * className ) const
Returns true if this object is an instance of a class that inherits className or a QObject subclass that inherits className; otherwise returns false.
A class is considered to inherit itself.
Example:
    QTimer *timer = new QTimer;         // QTimer inherits QObject
    timer->inherits("QTimer");          // returns true
    timer->inherits("QObject");         // returns true
    timer->inherits("QAbstractButton"); // returns false

    // QLayout inherits QObject and QLayoutItem
    QLayout *layout = new QLayout;
    layout->inherits("QObject");        // returns true
    layout->inherits("QLayoutItem");    // returns false
(QLayoutItem is not a QObject.)
Consider using qobject_cast<Type *>(object) instead. The method is both faster and safer.
See also metaObject() and qobject_cast().


Название: Как узнать к какому классу относится QWidget*
Отправлено: BaltikS от Июнь 16, 2006, 06:27
А есть ещё такая штука как className()


Название: Как узнать к какому классу относится QWidget*
Отправлено: igorko от Июнь 16, 2006, 11:42
Спасибо всем!

2 QCasper: В том то и дело что совсем не уверен

2 BaltikS:
className - это из Qt 3 Support Members for QObject
и не рекомендуется использовать в новом коде

2 AlexKiriukha: Ваша цитата походит лучше всего
И ключевая фраза из цитаты: "A class is considered to inherit itself."

Буду пробовать такое:
if (widgets.at(i)->inherits("QLineEdit") ) { работаем как с QLineEdit; }
else if (widgets.at(i)->inherits("QTextEdit") ) { работаем как с QTextEdit; }
...

Надеюсь будет работать...

Еще раз СПАСИБО!


Название: Как узнать к какому классу относится QWidget*
Отправлено: Asaphus_Expansus от Июнь 16, 2006, 13:14
void CMainWindow::widgetActivated()
{
   QObject* oPtr = sender();

   // Line Edit - get QString value and save it into configuration
   QLineEdit* le = qobject_cast<QLineEdit *>(oPtr);
   if( le )
      dataObject->saveValue(le->text());

   // Combo Box - get QString value and save it into configuration
   QComboBox* cb = qobject_cast<QComboBox *>(oPtr);
   if( cb )
      dataObject->saveValue(cb->currentText());   

и т.д.

}


Название: Как узнать к какому классу относится QWidget*
Отправлено: igorko от Июнь 16, 2006, 15:16
Дельный совет Asaphus.

Thanks a million!


Название: Как узнать к какому классу относится QWidget*
Отправлено: AlexKiriukha от Июнь 19, 2006, 11:48
Насколько я знаю, qobject_cast появился в Qt > 3. Так что если используется четверка - то это более удобный вариант.


Название: Как узнать к какому классу относится QWidget*
Отправлено: RSS от Июнь 20, 2006, 17:11
Есть традиционный способ для C++ - использовать dynamic_cast, который возвращает NULL, если преобразование невозможно. Для компилятора MSVC++ надо явно включить опцию (/GR). Остальные понимают так.

Т.е.
QLineEdit* le = dynamic_cast<QLineEdit *>(oPtr);
if( le )
   dataObject->saveValue(le->text());


Название: Как узнать к какому классу относится QWidget*
Отправлено: Gryz от Август 04, 2006, 11:18
Цитата: "igorko"
Спасибо всем!

2 BaltikS:
className - это из Qt 3 Support Members for QObject
и не рекомендуется использовать в новом коде

Это неправда.
obj->metaObject()->className()
Так работает

добавлено спустя 1 минуту:

 
Цитата: "AlexKiriukha"
Насколько я знаю, qobject_cast появился в Qt > 3. Так что если используется четверка - то это более удобный вариант.

Да. А в 3 вместо этого есть qt_cast