Найти - Пользователи
Полная версия: Событие мышки на кнопку
Начало » GUI » Событие мышки на кнопку
1
Ser5+
Добрый день. Нужна помощь по сигналам мышки,а именно запретить нажатие мышкой кнопку QPyshButton. Сделать только по enter. Нажатие по enter сделано,а вот как запретить для мышки не знаю. Вот эта функция button.button_pressed = False не работает мне кажется.

Вот кусок кода.Думаю этого достаточно.
button.button_pressed = False
button.clicked.connect(self.lp)
button.setAutoDefault(True)
PEHDOM
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+
Не будет ли примера небольшого,как используют этот фильтр событий? Допустим назначил кнопке 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
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+
Спасибо большое.Вопрос решен. Буду разбираться с фильтром,а то не использовал их никогда еще.
PEHDOM
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+
Имеете ввиду вместо
button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self)
Использовать
button1 = QtWidgets.MyButton('1. Гос. реестр предельных цен', self) ?
PEHDOM
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+
Отличный вариант по-моему. Только в моем случае
вместо
class MyButton(QtGui.QPushButton):
так
class MyButton(QtWidgets.QPushButton):
и все ок.
PEHDOM
там даже инит лишний достаточно вот так:
 class MyButton(QtWidgets.QPushButton):
    def mouseReleaseEvent(self, event):
        self.setDown(False)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB