Найти - Пользователи
Полная версия: PyQT5 | enterEvent | отображение кнопки при наведении на кнопку
Начало » GUI » PyQT5 | enterEvent | отображение кнопки при наведении на кнопку
1
Mr.Bolt
Добрый день.
Помогите решить следующую задачу:
Есть форма с кнопкой. Мне необходимо, чтобы при наведении курсора на кнопку на форме появлялась ещё одна кнопка, а при отведении она исчезала.
Пытался что-то изобразить, но получилось только вывести текст в консоль по этим событиям (с помощью функции 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 изучаю чуть больше месяца.
doza_and
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()
vic57
 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_()
не знаю как ты ее нажимать будешь
vic57
более продвинутый вариант
 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_()
но имхо смысла в такой кнопке мало
Mr.Bolt
Благодарю за ответы. В кнопке конечно смысла нет, но мне нужен был сам механизм вызова виджета по наведении мыши.
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