Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
 
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
1

PySide. Не применяется QShortcutContext

15.11.2016, 09:33. Просмотров 317. Ответов 1

Всем добрый день!

Разрабатываю приложение имеющее поле ввода (QLineEdit) с дефолтным значением (0.00). Пишу хоткей, который должен по нажатию на цифровую кнопку, независимо от фокуса на других виджетах стирать это дефолтное значение, если оно есть, и писать в это поле соответствующую цифру. Обнаружилось, что при фокусе на самом поле ввода хоткей никак не обрабатывается.

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

По логике, необходимо применять Qt.ApplicationShortcut, но он не сработал, как и все остальные. Поведение программы никак не меняется, хоткей не применяется при фокусе на поле ввода.

Привожу рабочий пример кода эмулирующий проблему:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import sys
from PySide import QtGui
from PySide import QtCore
 
class Example(QtGui.QWidget):
    
    def __init__(self):
 
        super(Example, self).__init__()
        self.initUI()
        
 
    def initUI(self):
 
        self.lineedit = QtGui.QLineEdit("0.00")
 
        self.radio1 = QtGui.QRadioButton("Radio 1")
        self.radio2 = QtGui.QRadioButton("Radio 2")
 
        self.shortcut = QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_1), self, None, context=QtCore.Qt.ApplicationShortcut)
        self.shortcut.activated.connect(self.printNumberToField)
 
        mainLayout = QtGui.QVBoxLayout()
 
        mainLayout.addWidget(self.lineedit)
        mainLayout.addWidget(self.radio1)
        mainLayout.addWidget(self.radio2)
 
        self.setLayout(mainLayout)
        
        self.setWindowTitle('Test context')    
        self.show()
 
    def printNumberToField(self):
        if (self.lineedit.text() == "0.00"):
            self.lineedit.setText("")
 
        if (self.sender() == self.shortcut):
            self.lineedit.setText(self.lineedit.text() + "1")
 
        
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 
 
if __name__ == '__main__':
    main()
Здесь поле ввода и два радио-баттона, при старте программы фокус на поле ввода. При попытке нажать кнопку "1" на клавиатуре, происходит дозапись в поле. Слот printNumberToField не срабатывает. Ежели запустить программу и кликнуть на один из радио-баттонов, тем самым сменив фокус на другой виджет и нажать "1", то слот отработает адекватно.

Подскажите пожалуйста, как же заставить хоткей работать на поле ввода? Что я делаю не так?

Windows 7, Python: 3.4, PySide: 1.2.4, Qt: 4.8.7
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2016, 09:33
Ответы с готовыми решениями:

Ошибка в PySide
Установил на Ubuntu 14.04 pyside скачал много примеров, работают нормально, но когда делаю свою...

Чекбоксы в PySide
Всем привет! Вопрос следующий: создан чекбокс PySide.QtGui.QCheckBox, но умолчанию в состоянии...

PySide + WindowModality
Здравствуйте, уважаемые! Имеется тестовый пример на PySide - по нажатию кнопки на родительском...

Не могу установить pyside
добрый день. Хочу установить Pyside, но выдает ошибку. А как апгрейдить пип, я не знаю. Подскажите,...

1
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
16.11.2016, 17:08  [ТС] 2
В общем, поразвлекавшись с дебагом глобальных ивентов выяснилась любопытная штука - если поле ввода в фокусе, у печатаемых клавиш срабатывает исключительно событие keyRelease. Если поле не в фокусе, то срабатывает как keyRelease, так и keyPressed. Мое мнение, что разрабы специально это сделали, чтобы в полях ввода не срабатывали ненароком хоткеи приложения. И да, на событиях задачу решить можно, но решили отказаться от этого, ибо ну его нахрен. Вопрос с неработающим контекстом так и остается открытым.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2016, 17:08

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

Pyside http server
Не могу написать http server простенький на pyside. Помогите пожалуйста

PySide. Нестандартные интерфейсы
Как проще всего реализовать такой интерфейс(рис. 1)? Спустя неделю написал некоторое подобие на...

Виджет на PySide/PyQT
Подскажите пожалуйста, как может называться виджет, в котором можно создавать дерево элементов с...

PySide потоки и анимация
Пытаюсь изучить PySide немножко. Написал простенькую прилагу для работы с БД. Есть момент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.