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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QPushButton и не только...  (Прочитано 7154 раз)
VAP
Гость
« : Июнь 30, 2008, 21:13 »

Нигде не нашел  как сделать кнопку-триггер(для смены шрифта, например), которая не меняет свое состояние (Enabled(true) или Enabled(false)), а по каждому нажатию на эту кнопку должны выполняться два разных действия. В Assistant нашел класс QActionEvent, у которого есть ActionChanged и ActionAdded (что-то вроде предыдущего состояния). Попробовал сделать вот так, пример кода:

Код:
void MainWindow::actionEvent(QActionEvent *event)
{
    QAction *action = event->action();
    QObject *obj = sender();
    if (qobject_cast<QPushButton*>(obj)) {
      if (event->type() == QEvent::ButtonPress) {
       
        switch(event->type()) {
        case QEvent::ActionChanged:
               setChangeAction(action);
               break;
        case QEvent::ActionAdded:
            connect(action, SIGNAL(triggered()), this, SLOT(triggeredAct()));
            break;
        default:
            ;
        }
        return;
    }
}   

void MainWindow::setChangeAction(QAction *action)
{
       addAction(action);
       reg->setText(action->iconText());
       reg->setIcon(action->icon());
}

void MainWindow::triggeredAct()
{
    if(QAction *action = qobject_cast<QAction*>(reg))
       emit triggered(action);
       действие…
    }
но чего-то не хватает, или есть иной какой способ? Буду очень благодарен за толковый совет.
« Последнее редактирование: Июль 02, 2008, 14:00 от pastor » Записан
Sergeich
Гость
« Ответ #1 : Июнь 30, 2008, 22:08 »

Ниасилил... Можно попонятней че надо сделать-то?
Записан
VAP
Гость
« Ответ #2 : Июнь 30, 2008, 22:18 »

Нужно чтобы при нажатии на одну кнопку могли выполняться два разных события (можно подключить 2 разных слота), причем циклически.
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #3 : Июнь 30, 2008, 22:28 »

А если при действии менять надпись на кнопке, и реагировать в соответствии с текущей надписью?
Записан

Как мало времени и как много нужно узнать
VAP
Гость
« Ответ #4 : Июнь 30, 2008, 22:36 »

Нужно менять надпись на кнопке при каждом очередном нажатии (раскладка клавиатуры
с "RUS" на "LAT") и еще при этом выполняются, при каждом очередном нажатии, два независимых действия.
Весь вопрос как их отловить(события), т.к. сигнал отловить тоже проблема.
Записан
ритт
Гость
« Ответ #5 : Июнь 30, 2008, 22:38 »

QActionEvent - вообще не в тему
весьма туманная формулировка /* пиши тз на заказ */
что значит "циклически"? нажали один раз - выполнилось событие1, нажали второй - событие2, третий - событие1 ?
если да {
 если баттон - акшен (например, кнопка на тулбаре) {
  сконнекть триггеред акшена со слотом, в котором по состоянию акшена будет выполнять действие1 или действие2
  void QAction::setData ( const QVariant & userData ) / QVariant QAction::data () const
 }
 иначе {
  то же самое, но с использованием динамикпроперти объекта
 }
}
иначе {
 выражай свои мысли яснее
}
самый простой вариант, который пришёл в голову
Записан
Karl-Philipp
Гость
« Ответ #6 : Июнь 30, 2008, 22:48 »

Нужно менять надпись на кнопке при каждом очередном нажатии (раскладка клавиатуры
с "RUS" на "LAT") и еще при этом выполняются, при каждом очередном нажатии, два независимых действия.
Весь вопрос как их отловить(события), т.к. сигнал отловить тоже проблема.

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

Или я не понял тз  Непонимающий
Записан
VAP
Гость
« Ответ #7 : Июнь 30, 2008, 22:52 »

Спасибо Константин, понял меня совершенно правильно. Буду работать над предложенным вариантом.   
Записан
ритт
Гость
« Ответ #8 : Июнь 30, 2008, 23:07 »

ну, для переключалки действительно лучше завести переменную - будет гораздо проще
а вариант выше - ближе для случая, когда кнопок множество и от состояния каждой могло бы что-то зависеть
Записан
Red Devil
Гость
« Ответ #9 : Июль 01, 2008, 00:29 »

Еще можно сделать для кнопки setCheckable, это сделает ее toogle button.
Это тоже самое что завести переменную bool, только ничего не нужно самому менять, только состояние проверять методом checked().
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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