(PyQt) 从外部按钮 class 中取消选中按钮?

(PyQt) Uncheck pushbutton from outside button's class?

设置了一个 QPushButton 'asCheckable'。从那里切换,一个 class 布尔值被改变。
这个改变的 bool 允许另一个 class 中的方法继续,并且在这个外部方法完成后我需要 return 按钮到它的初始状态,'setChecked(False)'.

虽然我能够在此外部方法结束时将 return 内含的 class 布尔值设置为默认状态,但我无法从外部访问取消单击按钮的方法。

我假设它是由于 classes init 中的参数,但这些是必要的 - 我想知道是否有另一种方法来实现描述的工作流程。

相关代码片段如下:

(有问题的命令在'Class 2'的底部区分)

Class 1:

class shapeCSVeditor(QtGui.QDialog, QtGui.QWidget):
   valueShare = []
   rowOverride = False#  <<=== equivalent to 'override' in 'Class 2'
   def __init__(self, iface, fileName, editorType, parent=None):
       super(shapeCSVeditor, self).__init__(parent)
       self.iface = iface
       self.editorType = editorType
       self.fileName = filename
       self.pushButtonSetBase = QtGui.QPushButton(self)
       self.pushButtonSetBase.setText("Set Base Shape")
       self.pushButtonSetBase.setCheckable(True)
       self.pushButtonSetBase.toggled.connect(self.on_pushButtonSetBase_toggled)
       self.layoutHorizontal.addWidget(self.pushButtonSetBase)

   #some other things here...

   @QtCore.pyqtSlot()
   def on_pushButtonSetBase_toggled(self):
       shapeCSVeditor.rowOverride = True
       pass

   def on_BaseRow_Changed(self):
       self.pushButtonSetBase.setChecked(False)
       return 

Class 2:

class CSVModel(QtCore.QAbstractTableModel):

  # Establish inital settings and branch processes
  def __init__(self, iface, fileName, editorType, parent=None):
      super(CSVModel,self).__init__()
      self.propertiesFile = r'some file'
      self.areaStressFile = r'some other file'          
      self.iface = iface
      self.rows = []
      self.editorType = editorType
      self.loadCSV()
      self.iface.mapCanvas().selectionChanged.connect(self.addRow)

  # add rows to the TableView based on object selection(s) in Qgis.mapCanvas
  def addRow(self):
      override = shapeCSVeditor.rowOverride
      selectedFeatures = selectedLayer.selectedFeatures()
      if override:
          for feature in selectedFeatures:
              self.rows.pop(0)
              feat_Attributes = []
              feat_Attributes.extend([self.iface.activeLayer().name()+'_'+str(feature.id())])
              feat_Attributes.extend(['',]*(len(self.header)-1))
              self.beginResetModel()
              self.rows.insert(0,feat_Attributes)
              shapeCSVeditor.rowOverride = False
              self.endResetModel()

              shapeCSVeditor.on_BaseRow_Changed# <<<=== wrong-diddily!

              break

PS - 如果将括号添加到 'shapeCSVeditor()' 按钮 class 中引用的 3 个参数是必需的,并且如果将括号添加到 'on_BaseRow_Changed',则return 是;

TypeError: unbound method on_BaseRow_Changed() must be called with shapeCSVeditor instance as first argument (got nothing instead)

你的做法很奇怪。 在 python 中,class 方法的第一个参数始终是对象本身。 所以,在你的:

   def on_BaseRow_Changed(self):
       self.pushButtonSetBase.setChecked(False)
       # return => This return is useless

如果您不提供对象,则无法访问按钮。

你没有给我们所有的代码,但我认为你应该为你的 addRow 提供你想要更新的 shapeCSVeditor 对象:

def addRow(self, shapeCSVObj):
   override = shapeCSVObj.rowOverride
   if override:
      for feature in selectedFeatures:
          self.rows.pop(0)
          feat_Attributes = []
          feat_Attributes.extend([self.iface.activeLayer().name()+'_'+str(feature.id())])
          feat_Attributes.extend(['',]*(len(self.header)-1))
          self.beginResetModel()
          self.rows.insert(0,feat_Attributes)
          shapeCSVObj.rowOverride = False
          self.endResetModel()

          shapeCSVObj.on_BaseRow_Changed()

          break

你必须在某处创建一个 shapeCSVeditor。您应该在 class.

之外提供给您

希望对您有所帮助。

class shapeCSVeditor(QtGui.QDialog, QtGui.QWidget):
    valueShare = []
    rowOverride = False
    def __init__(self, iface, fileName, editorType, parent=None):
        super(shapeCSVeditor, self).__init__(parent)
        self.iface = iface
        self.editorType = editorType
        self.fileName = fileName
        self.tableView = QtGui.QTableView(self)
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        self.tableData = CSVModel(self,iface,fileName,editorType)
               ^^==not implementing 'self' (shapeCSVeditor object) was the problem!
        self.tableView.setModel(self.tableData)
        ...
        self.pushButtonSetBase = QtGui.QPushButton(self)
        self.pushButtonSetBase.setText("Set Base Shape")
        self.pushButtonSetBase.setCheckable(True)
        self.pushButtonSetBase.clicked.connect(self.on_pushButtonSetBase_toggled)
        ...
    @QtCore.pyqtSlot()
    def on_pushButtonSetBase_toggled(self):
        self.rowOverride = True

    @QtCore.pyqtSlot()
    def on_BaseRow_Changed(self):
        self.rowOverride = False
        self.pushButtonSetBase.setChecked(False)

///////////////////////////////////////////////////////////////////////////////////////

class CSVModel(QtCore.QAbstractTableModel):
    def __init__(self, shapeCSVeditor, iface, fileName, editorType):
        super(CSVModel,self).__init__()
        self.propertiesFile = r'foo'
        self.areaStressFile = r'bar'
        self.tableView = shapeCSVeditor  <<== proper passing of shapeCSVeditor object! (?)
        self.iface = iface
        self.rows = []
        self.editorType = editorType
        self.loadCSV()
        self.iface.mapCanvas().selectionChanged.connect(self.addRow)

        ...

    def addRow(self):
        selectedFeatures = selectedLayer.selectedFeatures()
        if self.tableView.rowOverride:
            for feature in selectedFeatures:
                self.rows.pop(0)
                feat_Attributes = []
                feat_Attributes.extend([self.iface.activeLayer().name()+'_'+str(feature.id())])
                feat_Attributes.extend(['',]*(len(self.header)-1))
                self.beginResetModel()
                self.rows.insert(0,feat_Attributes)
                self.endResetModel()
                self.tableView.rowOverride = False
                self.tableView.on_BaseRow_Changed()

激进。满足当前需求。 现在的问题是它是否适合 python 'standards'。 对写作很陌生,所以可能还有更多需要修复。

非常感谢 Plouff 提供的线索。