How to get value from QDialog using multiple class

2019-03-02 14:51发布

问题:

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())