Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt]Множесто слотов 
:(
    Опции темы
rattick
Дата 12.3.2013, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Здравствуйте. Есть в Qt designer вот такой кусок формы
user posted image
В комбобоксе 5 значений в зависимости от выбранного индекса что то происходит с текстом lineEdit.
Код

...
    connect(ui.comboBox,SIGNAL(activated(int)),SLOT (change_pVh(int)));
...
void Valve::change_pVh(int ind){
    switch(ind){
        case 0:
            ui.lineEdit->setText(QString::number(ui.lineEdit->text().toDouble()/1000000));
            break;
        case 1:
            ui.lineEdit->setText(QString::number(ui.lineEdit->text().toDouble()*1000000));
            break;
         case 2:
            и т.д.
    }
}

т.е отправляем сигнал при каждой активации контрола, пишем слот в котором пишем что делать при выборе определенного индекса в комбобоксе. И ладно если он один такой. А если их 20 и в каждом по 5 значений? Можно написать по аналогии обработку для каждого,но кк то это очень громоздко. Есть ли какие то решения для таких случаев?  Заранее спасибо)

Это сообщение отредактировал(а) rattick - 12.3.2013, 02:15
PM MAIL   Вверх
Dem_max
Дата 12.3.2013, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: нет
Всего: 39



Цитата

Есть ли какие то решения для таких случаев?

нет. т.е. да раз ты программист то ты и должен реализовывать логику вычисления, никто кроме тебя не может угадать что ты там задумал на каждый пункт комбобокса.

Это сообщение отредактировал(а) Dem_max - 12.3.2013, 04:01


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
rattick
Дата 12.3.2013, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Так в том и штука, что содержание комбобоксов одинаковое. Различаться в слотах будет только имена контролов, все остальное одинаковое. Обычно в Qt есть общие решения для всякой рутины вот и подумал, что и тут что-то есть.
PM MAIL   Вверх
borisbn
Дата 12.3.2013, 08:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Добавляешь в комбобокс свойство, например "linkedEdit", цепляешь сигналы от всех комбобоксов на один слот, в котором по sender() узнаёшь, какой комбобокс послал сигнал
Код
void prepareComboAndEdit( QComboBox * combo, QLineEdit * edit ) {
    combo->setProperty( "linkedEdit", QVariant::fromValue( edit ) );
    connect( combo, SIGNAL( SIGNAL( activated( int ) ), SLOT( change_pVh ( int ) ) );
}

...
prepareComboAndEdit( ui.comboBox, ui.lineEdit );
prepareComboAndEdit( ui.comboBox_1, ui.lineEdit_1 );
и т.д.

void Valve::change_pVh( int ind ){
    QComboBox * combo = dynamic_cast< QComboBox * >( sender() );
    QLineEdit * edit = combo->property( "linkedEdit" ).value< QLineEdit * >();
    switch ( ind ) {
        ...
    }
}

а если ещё заранее каждому айтему комбобокса задать множитель, то можно и без switch обойтись:
Код

ui.comboBox->setItemData( 0, 1.0 / 1000000.0 );
ui.comboBox->setItemData( 1, 1000000.0 );
...
void Valve::change_pVh( int ind ){
    QComboBox * combo = dynamic_cast< QComboBox * >( sender() );
    QLineEdit * edit = combo->property( "linkedEdit" ).value< QLineEdit * >();
    edit->setText( QString::number( ui.lineEdit->text().toDouble() * combo->itemData( ind ).toDouble() ) );
}

а ещё, я бы вместо QLineEdit использовал бы QDoubleSpinBox


Это сообщение отредактировал(а) borisbn - 12.3.2013, 08:33


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
rattick
Дата 14.3.2013, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Огромное спасибо!! Только есть одно маленькое замечание: необходимо сделать объявление
Код

Q_DECLARE_METATYPE(QLineEdit *);

Иначе будет выскакивать ошибка
Код

1>c:\qt\4.8.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(169) : error C2039: 'qt_metatype_id' : is not a member of 'QMetaTypeId<T>'
1>        with
1>        [
1>            T=QLineEdit *
1>        ]
1>        c:\qt\4.8.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(169) : while compiling class template member function 'int QMetaTypeId2<T>::qt_metatype_id(void)'
1>        with
1>        [
1>            T=QLineEdit *
1>        ]
1>        c:\qt\4.8.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(230) : see reference to class template instantiation 'QMetaTypeId2<T>' being compiled
1>        with
1>        [
1>            T=QLineEdit *
1>        ]
1>        c:\qt\4.8.3\include\qtcore\../../src/corelib/kernel/qvariant.h(453) : see reference to function template instantiation 'int qMetaTypeId<T>(T *)' being compiled
1>        with
1>        [
1>            T=QLineEdit *
1>        ]
1>        c:\qt\4.8.3\include\qtcore\../../src/corelib/kernel/qvariant.h(337) : see reference to function template instantiation 'QVariant qVariantFromValue<T>(const T &)' being compiled
1>        with
1>        [
1>            T=QLineEdit *
1>        ]
1>        .\valve.cpp(33) : see reference to function template instantiation 'QVariant QVariant::fromValue<QLineEdit*>(const T &)' being compiled
1>        with
1>        [
1>            T=QLineEdit *
1>        ]

PM MAIL   Вверх
borisbn
Дата 14.3.2013, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



rattick, smile 
это я тебе на десерт оставил  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.