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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Иммитация события pressed  (Прочитано 5737 раз)
Vombat
Гость
« : Ноябрь 24, 2011, 16:19 »

Здравствуйте уважаемые форумчане.
Хочу попросить у вас помощи. Есть кнопка QPushButton num0. Также есть файл со стилями qss:
Код:
QPushButton { .... }
QPushButton:hover { .... }
QPushButton:focus:pressed { .... }
Файл подключил всё нормально. Кнопка изменила свой вид. При наведении на неё тоже всё отлично, и при нажатии также нужный результат. Далее мне потребовалось что бы при нажатии на клавишу ноль нажималась эта кнопка.
Сделал следующее в файле .cpp:
Код:
MyWindow::MyWindow() 
    ui.setupUi(this);
    QAction *mykey = new QAction(this);
    mykey->setShortcut(Qt::Key_0);
    addAction(mykey);
    connect(mykey, SIGNAL(triggered()), this, SLOT(mykeyresult()));
}

....

void MyWindow::mykeyresult()
{
    ui.num0->click();
}
функция mykeyresult() также указана в разделе private slots в .h файле.
Вообщем всё работает как надо. нажимаю на клавишу "ноль", срабатывает нажатие кнопки num0, точнее выполняются все те же действия что и при нажатии на мышкой на кнопку. Но изображение кнопки не меняется на состояние, то что описано в qss QPushButton:focus:pressed { .... }. Тоесть визуально не видно что копка нажимается.
Подскажите пожалуйста как решить эту проблему.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Ноябрь 24, 2011, 16:33 »

хоткей на кнопку вешать надо так:
Код
C++ (Qt)
ui.num0->setShortcut(QKeySequence(Qt::Key_0));
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Ноябрь 24, 2011, 17:17 »

Код
C++ (Qt)
connect(mykey, SIGNAL(triggered()), ui.num0, SLOT(animateClick()));
Записан
Vombat
Гость
« Ответ #3 : Ноябрь 24, 2011, 21:49 »

kambala
Цитировать
хоткей на кнопку вешать надо так:
Код
C++ (Qt)
ui.num0->setShortcut(QKeySequence(Qt::Key_0));
Спасибо это сделало мою программу более компактной.

Alex Custov
Цитировать
Код
C++ (Qt)
connect(mykey, SIGNAL(triggered()), ui.num0, SLOT(animateClick()));
Это не решает проблему, которая у меня возникла.

Вообщем методом тыка, я пришел к решению задачи. Возможно это и не самый элегантный и правильный способ, но работает. Может кому то пригодится.
Код:
MyWindow::MyWindow() 
    ui.setupUi(this);
    ui.num0->setShortcut(QKeySequence(Qt::Key_0));
    connect(ui.num0, SIGNAL(pressed()), this, SLOT(mykeyresult()));
}

....

void MyWindow::mykeyresult()
{
    ui.num0->setFocus();
    //необходимые действия по нажатию на кнопку или клавише назначенной на это кнопку
}

Этот способ работает, но если будут предложения по более корректному или правильному решению задачи, буду благодарен.
Записан
twp
Гость
« Ответ #4 : Ноябрь 24, 2011, 22:49 »

ну есть еще один вариант - послать событие мыши кнопке через QCoreApplication::postEvent() но не уверен что это будет более правильный и понятный способ
Записан
Bepec
Гость
« Ответ #5 : Ноябрь 25, 2011, 07:06 »

Цитировать
Alex Custov
Цитировать
Код
C++ (Qt)
connect(mykey, SIGNAL(triggered()), ui.num0, SLOT(animateClick()));
Это не решает проблему, которая у меня возникла.

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

Это решило бы твою задачу. Если не пробовал - то и не утверждай что не помогает.

animateСlick  имитирует нажатие кнопки пользователем (визуальное нажатие). Работает и функционирует в любых программах со стандартными кнопками Улыбающийся

НО. Решение с хоткеем мне нравится больше и оно проще Улыбающийся
Записан
Vombat
Гость
« Ответ #6 : Ноябрь 25, 2011, 13:15 »

Alex Custov Так в том то и дело что я попробовал перед тем как написать.
И кроме того animateClick(), не имеет отношения к визуальному нажатию (точнее к обычным кнопкам может и имеет, но у меня кнопки с stylesheet). Это обычное нажатие click но с задержкой указаной в милисекундах.
Вот ссылка на документацию. http://doc.qt.nokia.com/4.7/qabstractbutton.html#animateClick
И цель задачи была имитировать визуальное нажатие кнопки, при нажатии на клавишу назначенную этой кнопке. (визуальное оформление сделано в qss файле).
« Последнее редактирование: Ноябрь 25, 2011, 13:19 от Vombat » Записан
Bepec
Гость
« Ответ #7 : Ноябрь 25, 2011, 13:25 »

оффтоп:

Если тебе не говорит слово Animated, то увы.

По описанию выполняется АНИМИРОВАННОЕ нажатие кнопки.

по теме: Если у тебя StyleSheet  с фокусом (в 1 посте у тя на кнопке должен быть фокус и нажатие одновременно), то ты сам себе проблему нашел.

Убираешь focus: и все заработает даже с анимайтедем.

Но - решение с шоткаром лучше Улыбающийся

PS английский надо не просто учить, но еще и понимать что написано.


Записан
Vombat
Гость
« Ответ #8 : Ноябрь 25, 2011, 14:30 »

Bepec
По правде сказать, может там и есть момент нажитой проблемы, но вначале я пробовал QPushButton:pressed вместо QPushButton:focus:pressed. Да и вообще разные варианты с clicked и с animateClick. В итоге от того что ничего не получалось, решил задать вопрос на форуме. Пока что, по крайней мере у меня, только этот вариант заработал. Но конечно я не исключаю что есть более грамотные решения.
Я всем благодарен за помощь в решении задачи и за информацию.

Вопрос не по теме. Решил немного расширить возможность программы и мне потребовалось на одну кнопку вешать две клавиши. Как вторую прикрутить не подскажете? Если использовать setShortcut то первая клавиша перестаёт работать.
Записан
Bepec
Гость
« Ответ #9 : Ноябрь 25, 2011, 14:40 »

Мм... в стандартном классе QPushButton возможен только 1 шоткар Улыбающийся Если не переопределять класс, то только ловить нажатие на форме ручками.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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