Pyside QPushButton setCheckable - PullRequest
       7

Pyside QPushButton setCheckable

0 голосов
/ 13 сентября 2018

Я хотел бы создать QPushButton, который остается нажатым, пока пользователь не нажмет его снова. Я знаю, что могу использовать setCheckable для этого. Но я не уверен, как создать правильный сигнал для кнопки, которая срабатывает, когда кнопка меняет состояние, нажата и не нажата. Toggled, кажется, работает, но он посылает 3 аргумента. Я не уверен, какие 3 аргумента отправляются в моем примере.

import maya.cmds as cmds
import os
import maya.OpenMayaUI as mui
from PySide2 import QtWidgets,QtCore,QtGui
import shiboken2

class widget():
    def __init__(self):
        self.objs = ["box_1","box_2","box_3"]

    def label_event(self,text):
        print("this is the pressed button's label", text)

    def populate(self):
        for obj in self.objs:
            label = QtWidgets.QPushButton(obj)
            label.setCheckable(True)
            label.toggled.connect(partial(self.label_event, obj))
            self.vertical_layout_main.addWidget(label)

    def palette_ui(self):
        windowName = "palette"
        if cmds.window(windowName,exists = True):
            cmds.deleteUI(windowName, wnd = True)
        pointer = mui.MQtUtil.mainWindow()
        parent = shiboken2.wrapInstance(long(pointer),QtWidgets.QWidget)
        self.window = QtWidgets.QMainWindow(parent)
        self.window.setObjectName(windowName)
        self.window.setWindowTitle(windowName)
        self.mainWidget = QtWidgets.QWidget()
        self.window.setCentralWidget(self.mainWidget)
        self.vertical_layout_main = QtWidgets.QVBoxLayout(self.mainWidget)
        self.populate()        
        self.window.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.window.show()        

lg = widget()
lg.palette_ui()

1 Ответ

0 голосов
/ 13 сентября 2018

Вы должны активировать свойство с помощью setCheckable(True) и использовать сигнал toggled:

import sys
from PySide import QtGui

def function(checked):
    print("is checked?: ", checked)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    button = QtGui.QPushButton("press me")
    button.setCheckable(True)

    button.toggled.connect(function)

    button.show()
    sys.exit(app.exec_())

Обновление:

Не использовать объект - это зарезервированное слово, с другой стороны, сигнал передает проверенный параметр, если вы хотите передать другой параметр, вы также должны поместить его в функцию:

def label_event(self, text, checked): # <---
    print("this is the pressed button's label", text, checked)

def populate(self):
    for obj in self.objects:
        label = QtWidgets.QPushButton(obj)
        label.setCheckable(True)
        label.toggled.connect(partial(self.label_event, obj))
        self.vertical_layout_main.addWidget(label)
...