Форум сайта python.su
Добрый день. Нужна помощь по сигналам мышки,а именно запретить нажатие мышкой кнопку QPyshButton. Сделать только по enter. Нажатие по enter сделано,а вот как запретить для мышки не знаю. Вот эта функция button.button_pressed = False не работает мне кажется.
Вот кусок кода.Думаю этого достаточно.
button.button_pressed = False
button.clicked.connect(self.lp)
button.setAutoDefault(True)
Офлайн
Ser5+Нужно или создавать свой класс унаследовав от QtGui.QPushButton и переопределить mouseReleaseEvent(можно конечно и в инстансе переопределить mouseReleaseEvent но это будет некошерно), или использовать фильтр событий installEventFilter(QObj) - def eventFilter(self, obj, event): и там фильтровать по типу if event.type()==3 (QEvent::MouseButtonRelease) и type(obj) == QPushButton то ничего не делаем(ну кроме как obj.setDown(False), а то некрасиво выходит).. иначе действие по уомлчанию…
Нужна помощь по сигналам мышки,а именно запретить нажатие мышкой кнопку QPyshButton. Сделать только по enter. Нажатие по enter сделано,а вот как запретить для мышки не знаю.
[code python][/code]
Отредактировано PEHDOM (Ноя. 18, 2019 13:46:30)
Офлайн
Не будет ли примера небольшого,как используют этот фильтр событий? Допустим назначил кнопке button1.installEventFilter(self), а вот в функции пытается сразу войти и ошибку выдает.
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.setMinimumSize(QtCore.QSize(300, 180))
self.setWindowTitle(“Выберите пункт(Enter-выбор,Esc-отклонить)”)
ico = QtGui.QIcon(“icon.ico”)
self.setWindowIcon(ico) # Значок для окна
# Местоположение окна на экране по центру на точность
desktop = QtWidgets.QApplication.desktop()
# Минимальные размеры окна
self.resize(300,180)
x = (desktop.width() - self.frameSize().width()) //2
y = (desktop.height() - self.frameSize().height()) //2
self.move(x,y)
button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self)
button2 = QtWidgets.QPushButton('2. Гос. реестр ЛС', self)
#Зададим стили
button1.setStyleSheet('QPushButton{font-size:14px; font:bold}')
button2.setStyleSheet('QPushButton{font-size:14px; font:bold}')
#попытаться поставить запрет на нажатие кнопок мышкой
## self.mouse_pressed = False
## button1.mouse_pressed = False
button1.installEventFilter(self) #test
button1.clicked.connect(self.lp)
button1.setAutoDefault(True)
button1.resize(250, 50)
button1.move(25, 30)
button2.clicked.connect(self.grls)
button2.setAutoDefault(True)
button2.resize(250, 50)
button2.move(25, 90)
#test
def eventFilter(self, obj, event):
print('проверка')
## if event.type()==3 (QEvent.MouseButtonRelease) and type(obj) == QPushButton:
## print('выпва')
Офлайн
Ser5+хмм if event.type()==3 (QEvent.MouseButtonRelease) and type(obj) == QPushButton:
Не будет ли примера небольшого,как используют этот фильтр событий?
from PyQt4 import QtCore, QtGui # У вас PyQt5 поэтому вместо этих строк from PyQt4 import QtGui as QtWidgets # вы вставляете свои импорты import sys class MainWindow(QtWidgets.QMainWindow): def __init__(self): QtWidgets.QMainWindow.__init__(self) self.setMinimumSize(QtCore.QSize(300, 180)) self.setWindowTitle('Выберите пункт(Enter-выбор,Esc-отклонить)') button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self) button2 = QtWidgets.QPushButton('2. Гос. реестр ЛС', self) button1.setStyleSheet('QPushButton{font-size:14px; font:bold}') button2.setStyleSheet('QPushButton{font-size:14px; font:bold}') button1.installEventFilter(self) #test button1.clicked.connect(self.lp) button1.setAutoDefault(True) button1.resize(250, 50) button1.move(25, 30) button2.clicked.connect(self.grls) button2.setAutoDefault(True) button2.resize(250, 50) button2.move(25, 90) self.show() def lp(self): print('тут должно вылазить окошко #1') def grls(self): print('тут должно вылазить окошко #2') def eventFilter(self, obj, event): if event.type()==QtCore.QEvent.MouseButtonRelease and type(obj) == QtWidgets.QPushButton: #равнозначно if event.type()==3 and type(obj) == QtWidgets.QPushButton: obj.setDown(False) # поскольку мы игнорируем событие нам нужно "отжать" кнопку "принудительно" return True return False # обратите внимание eventFilter должен обязательно вернуть True или False if __name__ == '__main__': app = QtGui.QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
[code python][/code]
Отредактировано PEHDOM (Ноя. 18, 2019 14:53:37)
Офлайн
Спасибо большое.Вопрос решен. Буду разбираться с фильтром,а то не использовал их никогда еще.
Офлайн
Ser5+может таки проще перепределить mouseReleaseEvent?
Буду разбираться с фильтром,а то не использовал их никогда еще.
class MyButton(QtGui.QPushButton): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def mouseReleaseEvent(self, event): self.setDown(False)
[code python][/code]
Офлайн
Имеете ввиду вместо
button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self)
Использовать
button1 = QtWidgets.MyButton('1. Гос. реестр предельных цен', self) ?
Офлайн
Ser5+да только не QtWidgets.MyButton а просто MyButton если вы класс определяете в этом же файле..
Имеете ввиду вместо
button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self)
Использовать
button1 = QtWidgets.MyButton('1. Гос. реестр предельных цен', self) ?
from PyQt4 import QtCore, QtGui # У вас PyQt5 пожтому импорты вы вставляете свои from PyQt4 import QtGui as QtWidgets import sys class MyButton(QtGui.QPushButton): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def mouseReleaseEvent(self, event): self.setDown(False) class MainWindow(QtWidgets.QMainWindow): def __init__(self): QtWidgets.QMainWindow.__init__(self) self.setMinimumSize(QtCore.QSize(300, 180)) self.setWindowTitle('Выберите пункт(Enter-выбор,Esc-отклонить)') button1 = MyButton('1. Гос. реестр предельных цен', self) button2 = QtWidgets.QPushButton('2. Гос. реестр ЛС', self) button1.setStyleSheet('QPushButton{font-size:14px; font:bold}') button2.setStyleSheet('QPushButton{font-size:14px; font:bold}') button1.clicked.connect(self.lp) button1.setAutoDefault(True) button1.resize(250, 50) button1.move(25, 30) button2.clicked.connect(self.grls) button2.setAutoDefault(True) button2.resize(250, 50) button2.move(25, 90) self.show() def lp(self): print('тут должно вылазить окошко #1') def grls(self): print('тут должно вылазить окошко #2') if __name__ == '__main__': app = QtGui.QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
[code python][/code]
Отредактировано PEHDOM (Ноя. 18, 2019 15:11:22)
Офлайн
Отличный вариант по-моему. Только в моем случае
вместо
class MyButton(QtGui.QPushButton):
так
class MyButton(QtWidgets.QPushButton):
и все ок.
Офлайн
там даже инит лишний достаточно вот так:
class MyButton(QtWidgets.QPushButton): def mouseReleaseEvent(self, event): self.setDown(False)
[code python][/code]
Офлайн