(PyQt)从外部按钮的课程中取消选中按钮?

时间:2015-01-19 12:28:35

标签: python pyqt qpushbutton class-method

QPushButton设置为'asCheckable'。切换后,班级布尔改变了。
这个改变的bool允许一个不同类的方法继续进行,并且在完成这个外部方法后,我需要将按钮返回到它的初始状态'setChecked(False)'。

虽然我能够在此外部方法结束时将类封装bool返回到其默认状态,但我无法从外部访问取消单击该按钮的方法。

我认为它是由于 init 类中的参数,但这些是必要的 - 我想知道是否还有其他方法可以实现所描述的工作流程。

相关代码剪辑如下:

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

第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 

第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()'3参数是Button类中引用的必需参数,如果括号被添加到'on_BaseRow_Changed',则返回为;

  

TypeError:必须使用调用未绑定的方法on_BaseRow_Changed()   shapeCSVeditor实例作为第一个参数(没有取而代之)

2 个答案:

答案 0 :(得分:1)

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

   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。你应该把它提供给课外

希望这有帮助。

答案 1 :(得分:0)

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&#39;标准。 写作相当新,因此可能需要修复更多需求。

非常感谢Plouff的线索。