Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQT5 | enterEvent | отображение кнопки при наведении на кнопку [RSS Feed]

#1 Сен. 6, 2017 16:30:06

Mr.Bolt
Зарегистрирован: 2017-09-06
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 | enterEvent | отображение кнопки при наведении на кнопку

Добрый день.
Помогите решить следующую задачу:
Есть форма с кнопкой. Мне необходимо, чтобы при наведении курсора на кнопку на форме появлялась ещё одна кнопка, а при отведении она исчезала.
Пытался что-то изобразить, но получилось только вывести текст в консоль по этим событиям (с помощью функции print)

 import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(QtWidgets.QWidget):
    def start(self):
        super().start()
        self.initUi()
    def initUi(self):
        self.setGeometry(300,100,500,500)
        self.setWindowTitle("STRING")
        MegaButton = Button(self)
        MegaButton.setFixedSize(200, 50)
        MegaButton.setObjectName("PUSH")
        MegaButton.move(50, 50)
        self.show()
class Button(QtWidgets.QPushButton):
    def enterEvent(self, *args, **kwargs):
        print("TEXT1")
        btn = QtWidgets.QPushButton(Ui_Form)
        btn.setFixedSize(200, 50)
        btn.setObjectName("PUSH")
        btn.move(60, 60)
    def leaveEvent(self, *args, **kwargs):
        print("TEXT2")
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myapp = Ui_Form()
    sys.exit(app.exec_())

Перепробовал много вариантов. И создавать новую кнопку как отдельный класс, и добавлять в Ui_Form функцию для создания кнопки. Остается не понятным момент как из функции enterEvent класса Button инициировать создание кнопки.
Подтолкните в нужную сторону или пример какой-нибудь простенький покажите. Python изучаю чуть больше месяца.

Офлайн

#2 Сен. 6, 2017 18:36:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

PyQT5 | enterEvent | отображение кнопки при наведении на кнопку

Mr.Bolt
а при отведении она исчезала.
А это точно кнопка? Как ее нажать если она исчезает? Предполагается использование клавиатуры или должно срабатывать нажатие на пустом месте?

В вашем коде непонятно как вы заставляете кнопку исчезнуть.
Qt не знаю вообще. Но по идее практически во всех gui можно инвалидировать текущую сцену чтобы перерисовать элементы. Попробуйте чуток подвигать окошко чтобы проверить наличие новой кнопки.

Рабочий код для нервной кнопки. Может наведет на какие мысли…
 import wx
app = wx.App()
frm = wx.Frame(None, title="Hello")
st = wx.Button( frm, label="strangeButton", pos=(50,50))
button = wx.Button( frm, label = u"MyButton")
def f(evt):
    st.Hide()
def g(evt):
    st.Show()
button.Bind( wx.EVT_ENTER_WINDOW, f)
button.Bind( wx.EVT_LEAVE_WINDOW, g)
frm.Show()
app.MainLoop()



Отредактировано doza_and (Сен. 6, 2017 19:15:02)

Офлайн

#3 Сен. 6, 2017 23:28:00

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQT5 | enterEvent | отображение кнопки при наведении на кнопку

 from PyQt5.Qt import *
class W(QWidget):
    def __init__(self):
        super().__init__()
        self.btn = QPushButton('btn')
        grid = QGridLayout(self)
        grid.addWidget(self.btn)
        self.btn.hide()
        self.setMouseTracking(True)
    def mouseMoveEvent(self,e):
        rect = QRect(0,0,20,20)
        if e.pos() in rect:
            self.btn.show()
        else: self.btn.hide()
if __name__ == '__main__':
    app = QApplication([])
    w = W()
    w.show()
    app.exec_()
не знаю как ты ее нажимать будешь

Офлайн

#4 Сен. 7, 2017 21:00:17

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQT5 | enterEvent | отображение кнопки при наведении на кнопку

более продвинутый вариант

 import sys
from PyQt5.Qt import *
class W(QWidget):
    def __init__(self):
        super().__init__()
        self.btn1 = QPushButton('Button')
        self.btn1.setObjectName('btn1')
        self.btn2 = QPushButton('HideButton')
        grid = QGridLayout(self)
        grid.addWidget(self.btn1,0,0)
        grid.addWidget(self.btn2,1,0)
        self.btn2.hide()
        qApp.installEventFilter(self)
    def eventFilter(self,obj,event):
        if obj.objectName() == 'btn1':
            if event.type() == QEvent.Enter:
                self.btn2.show()
            if event.type() == QEvent.Leave:
                self.btn2.hide()
        return QWidget.eventFilter(self,obj,event)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.lastWindowClosed.connect(sys.exit)
    w = W()
    w.move(0,0)
    w.show()
    app.exec_()
но имхо смысла в такой кнопке мало

Офлайн

#5 Сен. 12, 2017 11:07:31

Mr.Bolt
Зарегистрирован: 2017-09-06
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 | enterEvent | отображение кнопки при наведении на кнопку

Благодарю за ответы. В кнопке конечно смысла нет, но мне нужен был сам механизм вызова виджета по наведении мыши.

Офлайн

  • Начало
  • » GUI
  • » PyQT5 | enterEvent | отображение кнопки при наведении на кнопку[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version