Ser5+
Ноя. 18, 2019 11:19:56
Добрый день. Нужна помощь по сигналам мышки,а именно запретить нажатие мышкой кнопку QPyshButton. Сделать только по enter. Нажатие по enter сделано,а вот как запретить для мышки не знаю. Вот эта функция button.button_pressed = False не работает мне кажется.
Вот кусок кода.Думаю этого достаточно.
button.button_pressed = False
button.clicked.connect(self.lp)
button.setAutoDefault(True)
PEHDOM
Ноя. 18, 2019 13:38:17
Ser5+
Нужна помощь по сигналам мышки,а именно запретить нажатие мышкой кнопку QPyshButton. Сделать только по enter. Нажатие по enter сделано,а вот как запретить для мышки не знаю.
Нужно или создавать свой класс унаследовав от QtGui.QPushButton и переопределить mouseReleaseEvent(можно конечно и в инстансе переопределить mouseReleaseEvent но это будет некошерно), или использовать фильтр событий installEventFilter(QObj) - def eventFilter(self, obj, event): и там фильтровать по типу if event.type()==3 (QEvent::MouseButtonRelease) и type(obj) == QPushButton то ничего не делаем(ну кроме как obj.setDown(False), а то некрасиво выходит).. иначе действие по уомлчанию…
Ser5+
Ноя. 18, 2019 14:22:09
Не будет ли примера небольшого,как используют этот фильтр событий? Допустим назначил кнопке 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('выпва')
PEHDOM
Ноя. 18, 2019 14:49:52
Ser5+
Не будет ли примера небольшого,как используют этот фильтр событий?
хмм if event.type()==3 (QEvent.MouseButtonRelease) and type(obj) == QPushButton:
(QEvent.MouseButtonRelease) было просто пояснением что такое event.type()==3, можно вместо 3 вставить QtCore.QEvent.MouseButtonRelease с тем же результатом.
а вобще както так:
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())
Ser5+
Ноя. 18, 2019 14:55:35
Спасибо большое.Вопрос решен. Буду разбираться с фильтром,а то не использовал их никогда еще.
PEHDOM
Ноя. 18, 2019 14:59:56
Ser5+
Буду разбираться с фильтром,а то не использовал их никогда еще.
может таки проще перепределить mouseReleaseEvent?
class MyButton(QtGui.QPushButton):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def mouseReleaseEvent(self, event):
self.setDown(False)
и там где нужны кнопки с специфическим поведением вместо QPushButton использовать MyButton
Ser5+
Ноя. 18, 2019 15:08:02
Имеете ввиду вместо
button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self)
Использовать
button1 = QtWidgets.MyButton('1. Гос. реестр предельных цен', self) ?
PEHDOM
Ноя. 18, 2019 15:10:03
Ser5+
Имеете ввиду вместо
button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self)
Использовать
button1 = QtWidgets.MyButton('1. Гос. реестр предельных цен', self) ?
да только не QtWidgets.MyButton а просто MyButton если вы класс определяете в этом же файле..
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())
и тот и тот метод имеют свои плюсы и минусы, все зависит от того что вам нужно конкретно.
Ser5+
Ноя. 18, 2019 15:15:01
Отличный вариант по-моему. Только в моем случае
вместо
class MyButton(QtGui.QPushButton):
так
class MyButton(QtWidgets.QPushButton):
и все ок.
PEHDOM
Ноя. 18, 2019 15:20:02
там даже инит лишний достаточно вот так:
class MyButton(QtWidgets.QPushButton):
def mouseReleaseEvent(self, event):
self.setDown(False)