Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 18, 2019 11:19:56

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

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

Вот кусок кода.Думаю этого достаточно.
button.button_pressed = False
button.clicked.connect(self.lp)
button.setAutoDefault(True)

Офлайн

#2 Ноя. 18, 2019 13:38:17

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

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), а то некрасиво выходит).. иначе действие по уомлчанию…





==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 18, 2019 13:46:30)

Офлайн

#3 Ноя. 18, 2019 14:22:09

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

Не будет ли примера небольшого,как используют этот фильтр событий? Допустим назначил кнопке 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('выпва')


Офлайн

#4 Ноя. 18, 2019 14:49:52

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

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())



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 18, 2019 14:53:37)

Офлайн

#5 Ноя. 18, 2019 14:55:35

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

Спасибо большое.Вопрос решен. Буду разбираться с фильтром,а то не использовал их никогда еще.

Офлайн

#6 Ноя. 18, 2019 14:59:56

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

Ser5+
Буду разбираться с фильтром,а то не использовал их никогда еще.
может таки проще перепределить mouseReleaseEvent?

 class MyButton(QtGui.QPushButton):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def mouseReleaseEvent(self, event):
        self.setDown(False)
и там где нужны кнопки с специфическим поведением вместо QPushButton использовать MyButton



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Ноя. 18, 2019 15:08:02

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

Имеете ввиду вместо
button1 = QtWidgets.QPushButton('1. Гос. реестр предельных цен', self)
Использовать
button1 = QtWidgets.MyButton('1. Гос. реестр предельных цен', self) ?

Офлайн

#8 Ноя. 18, 2019 15:10:03

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

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())
и тот и тот метод имеют свои плюсы и минусы, все зависит от того что вам нужно конкретно.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 18, 2019 15:11:22)

Офлайн

#9 Ноя. 18, 2019 15:15:01

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

Отличный вариант по-моему. Только в моем случае
вместо
class MyButton(QtGui.QPushButton):
так
class MyButton(QtWidgets.QPushButton):
и все ок.

Офлайн

#10 Ноя. 18, 2019 15:20:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Событие мышки на кнопку

там даже инит лишний достаточно вот так:

 class MyButton(QtWidgets.QPushButton):
    def mouseReleaseEvent(self, event):
        self.setDown(False)



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version