2015-01-19 2 views
0

A QPushButton установлен как 'Проверяемый'. Когда переключается, класс bool изменяется.
Этот измененный bool позволяет продолжить метод в другом классе, и после завершения этого внешнего метода мне нужно вернуть кнопку в исходное состояние «setChecked (False)».(PyQt) Снимите отметку с кнопки со стороны кнопки?

В то время как я могу вернуть класс, помещенный в bool, в состояние по умолчанию в конце этого внешнего метода, я не могу получить внешний доступ к методу, который отжимает кнопку.

Я предполагаю, что это связано с аргументами в классах init, но это необходимо - и мне интересно, есть ли другое средство для достижения описанного рабочего процесса.

код Связанные ножницы ниже:

(команда в вопросе отличается в нижней части 'класса 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: unbound method on_BaseRow_Changed() must be called with shapeCSVeditor instance as first argument (got nothing instead)

ответ

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, который создается. Вы должны предоставить его вам наружный класс.

Надеюсь, это поможет.

+0

Ваш совет помогает, спасибо. Я обновил исходный вопрос, чтобы надеяться на помощь в решении. – Katalpa

+0

Я не думаю, что проблема в классе 1, но в классе 2. Не могли бы вы добавить код, в котором вы создаете объект 'shapeCSVeditor'? – Plouff

+0

Обновлено: На данный момент я не создаю объект shapeCSVeditor явно ... – Katalpa

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

Radical. Работает для текущих потребностей. Теперь вопрос в том, соответствует ли он стандарту python. Совершенно новый для написания, поэтому его возможные потребности исправлены.

Большое спасибо Plouff за подсказки.

+0

К сожалению, мы не можем видеть, как вы используете свой класс CSVModel. Но это кажется хорошим. Я имею в виду, если вы используете его таким образом, это хорошо: 'csvEditor = shapeCSVeditor (a, b, ....); shapeCSVeditor (csvEditor, c, d, ...) '. Я рекомендую вам прочитать учебник для ООП в Python, это некоторые основные понятия, которые вам не хватает (например, создание объекта при определении класса). Например: http://www.python-course.eu/object_oriented_programming.php. Счастливое кодирование :). – Plouff

Смежные вопросы