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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать к какому классу относится QWidget*  (Прочитано 6403 раз)
igorko
Гость
« : Июнь 15, 2006, 21:52 »

Здравствуйте все!

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

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

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

Спасибо!
Записан
QCasper
Гость
« Ответ #1 : Июнь 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 и в том духе
Записан
AlexKiriukha
Гость
« Ответ #2 : Июнь 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().
Записан
BaltikS
Гость
« Ответ #3 : Июнь 16, 2006, 06:27 »

А есть ещё такая штука как className()
Записан
igorko
Гость
« Ответ #4 : Июнь 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; }
...

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

Еще раз СПАСИБО!
Записан
Asaphus_Expansus
Гость
« Ответ #5 : Июнь 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());   

и т.д.

}
Записан
igorko
Гость
« Ответ #6 : Июнь 16, 2006, 15:16 »

Дельный совет Asaphus.

Thanks a million!
Записан
AlexKiriukha
Гость
« Ответ #7 : Июнь 19, 2006, 11:48 »

Насколько я знаю, qobject_cast появился в Qt > 3. Так что если используется четверка - то это более удобный вариант.
Записан
RSS
Гость
« Ответ #8 : Июнь 20, 2006, 17:11 »

Есть традиционный способ для C++ - использовать dynamic_cast, который возвращает NULL, если преобразование невозможно. Для компилятора MSVC++ надо явно включить опцию (/GR). Остальные понимают так.

Т.е.
QLineEdit* le = dynamic_cast<QLineEdit *>(oPtr);
if( le )
   dataObject->saveValue(le->text());
Записан
Gryz
Гость
« Ответ #9 : Август 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
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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