Изменить поведение QPushButton, если горячая клавиша удерживается? - PullRequest
0 голосов
/ 04 декабря 2018

Можно ли изменить внешний вид и функцию QPushButton, например, при наведении курсора, если удерживать горячую клавишу?

Я нахожусь в поиске решения, согласно которому, если я удерживал клавишу CTRL, а затем зависал, затем нажимал, это будет иметь другой результат для зависания и нажмите

Я использую Pyside в настоящее время, и это приложение для Maya

1 Ответ

0 голосов
/ 05 декабря 2018

Вот пример подкласса QPushButton событий входа и выхода.Он будет изменять таблицы стилей, когда удерживается Ctrl, а также будет выполнять функцию, отличную от нажатой клавиши Ctrl:

from PySide2 import QtCore, QtGui, QtWidgets


class CustomButton(QtWidgets.QPushButton):

    def __init__(self, label, parent=None):
        super(CustomButton, self).__init__(label, parent)

        self.entered = False  # Track when the cursor enters this widget.

        self.normal_style = "QPushButton {background-color:red;}"
        self.alt_style = "QPushButton {background-color:blue;}"

        self.setStyleSheet(self.normal_style)

        self.clicked.connect(self.click_event)

    def enterEvent(self, event):
        self.entered = True
        self.set_style()

    def leaveEvent(self, event):
        self.entered = False
        self.setStyleSheet(self.normal_style)

    def set_style(self):
        if self.entered and self.parent().is_ctrl_down:
            self.setStyleSheet(self.alt_style)
        else:
            self.setStyleSheet(self.normal_style)

    def func_1(self):
        print "1"

    def func_2(self):
        print "2"

    def click_event(self):
        if self.entered and self.parent().is_ctrl_down:
            self.func_2()
        else:
            self.func_1()


class Window(QtWidgets.QWidget):

    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.is_ctrl_down = False  # Track when ctrl is held down.

        self.my_button = CustomButton("Hello World!", parent=self)

        self.main_layout = QtWidgets.QVBoxLayout()
        self.main_layout.addWidget(self.my_button)
        self.setLayout(self.main_layout)

        self.resize(400, 400)
        self.setWindowTitle("Button behaviour example")

    def keyPressEvent(self, event):
        ctrl_state = event.modifiers() == QtCore.Qt.CTRL
        if ctrl_state != self.is_ctrl_down:
            self.is_ctrl_down = ctrl_state
            self.my_button.set_style()

    def keyReleaseEvent(self, event):
        self.is_ctrl_down = False
        self.my_button.set_style()


tool = Window()
tool.show()

Я проверял это на Maya 2018, поэтому он находится в PySide2.Если вы используете более старую версию с PySide, вам понадобятся незначительные изменения, чтобы этот пример работал.

...