How to get value from QDialog using multiple class

≡放荡痞女 提交于 2019-12-02 10:22:08

问题


I am currently working in a panel in Nuke 11 that opens a QDialog and I was wondering how to get a value from it into my main class when I close my QDialog ? The QDialog is in a different class. This is a simplified example that shows my problem :

import nuke
from nukescripts import panels
try:
  ## < Nuke11
    import PySide.QtGui as QtGui
    import PySide.QtCore as QtCore

except:
  ## >= Nuke11
    import PySide2.QtCore as QtCore
    import PySide2.QtGui as QtGui
    import PySide2.QtWidgets as QtGui
    from PySide2.QtWidgets import QWidget as QWidget

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example,self).__init__()
        layout = QtGui.QVBoxLayout()

        button = QtGui.QPushButton('Get Value')
        button.clicked.connect(self.someFunction)

        layout.addWidget(button)
        self.setLayout(layout)

    def someFunction(self):
        value = self.GetValueLineEdit()
        if value :
            # do something

    def GetValueLineEdit(self):
        class getValuePanel(QtGui.QDialog):
            def __init__(self):
                super(getValuePanel, self).__init__()
                layout = QtGui.QHBoxLayout()

                self.lineEdit = QtGui.QLineEdit('')

                getValueButton = QtGui.QPushButton('Get Value')
                getValueButton.clicked.connect(self.getValue)

                layout.addWidget(self.lineEdit)
                layout.addWidget(getValueButton)
                self.setLayout(layout)

            def getValue(self):
                value = str(self.lineEdit.text())
                getValuePanel.accept() #To Close the QDialog
                return value

        getValuePanel = getValuePanel()
        getValuePanel.show()

pane = nuke.getPaneFor("Example.panel")
panels.registerWidgetAsPanel('Example', 'Example',"", True).addToPane(pane)

Thanks a lot,


回答1:


First of all you do not create classes within other classes, it is considered a bad practice. On the other hand what returns a slot is not used since no one receives it, so what returns getValue will be lost, what you must do is that the clicked call accept closing the QDialog and after verifying that the dialogue has been accepted you just have to call getValue:

class ValuePanel(QtGui.QDialog):
    def __init__(self):
        super(ValuePanel, self).__init__()
        self.lineEdit = QtGui.QLineEdit()
        getValueButton = QtGui.QPushButton('Get Value')
        getValueButton.clicked.connect(self.accept)

        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.lineEdit)
        layout.addWidget(getValueButton)

    def getValue(self):
        value = str(self.lineEdit.text())
        return value

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example,self).__init__()
        button = QtGui.QPushButton('Get Value')
        button.clicked.connect(self.someFunction)

        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(button)

    @QtCore.Slot()
    def someFunction(self):
        value_panel = ValuePanel()
        if value_panel.exec_() == QtGui.QDialog.Accepted:
            print(value_panel.getValue())


来源:https://stackoverflow.com/questions/53178290/how-to-get-value-from-qdialog-using-multiple-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!