(Un)ChechkingAll from Tree View
-
Now i have in function checkall that:
checkBoxList= QStandardItem() checkBoxList.setCheckState(Qt.Checked)
no error, but when I unchecked some boxes in TreeView they don't chacked after cliking this button
@Karoluss96
Why would you name a singleQStandardItem()
ascheckBoxList
? Won't that just confuse you and me?You seem to be creating a
QStandardItem
into a local variable. I really don't know what you are doing with that item, if anything. You are supposed to be callingsetCheckState()
on each item in your model, which is what the view is displaying.While I notice it, you showed originally:
for checks in checkBoxList: if checkBoxList.CheckState(): checkBoxList.setCheckState(Qt.Checked) print(checkBoxList)
What is the point of a
for checks in checkBoxList
loop if you only accesscheckBoxList
inside it? -
I need an access for data in tree View, which is make in a different function.
I'll show on attached photo:
is in polish so: "zaznacz wszystko"="check all"
odznacz wszystko ="un check all".
Right, I thought that loop will be better, but all times
but I have an error: " 'QStandardItem' object is not iterable" -
I need an access for data in tree View, which is make in a different function.
I'll show on attached photo:
is in polish so: "zaznacz wszystko"="check all"
odznacz wszystko ="un check all".
Right, I thought that loop will be better, but all times
but I have an error: " 'QStandardItem' object is not iterable"@Karoluss96 said in (Un)ChechkingAll from Tree View:
but I have an error: " 'QStandardItem' object is not iterable"
Exactly, it is not. If a single
QStandardItem
, or a single checkbox, is namedcheckBoxList
it's not helpful. There is no list and nothing to loop over.I don't know what to say that @SGaist has not stated clearly in:
My suggestion is that you use that QStandardItemModel directly and go through all the items you want/need to modify their value.
calling
setCheckState(Qt.Checked)
on each item. -
yes, the variable name 'checkBoxList' is confusing, but it doesn't matter for that I need a loop for all Checkboxes as I shown in the print screen above
-
yes, the variable name 'checkBoxList' is confusing, but it doesn't matter for that I need a loop for all Checkboxes as I shown in the print screen above
@Karoluss96 said in (Un)ChechkingAll from Tree View:
yes, the variable name 'checkBoxList' is confusing,
Then change it, and get rid of " " 'QStandardItem' object is not iterable"" error.
I need a loop for all Checkboxes as I shown in the print screen above
And I referred you to @SGaist's answer to that, which is what you need to do.
-
@JonB said in (Un)ChechkingAll from Tree View:
@SGaist can you explain more what do you mean?
-
@JonB said in (Un)ChechkingAll from Tree View:
@SGaist can you explain more what do you mean?
@SGaist said in (Un)ChechkingAll from Tree View:
When you want to change them all, go through all the items in your model and call setCheckState on them.
-
Do you know how to go through all the items/rows in your model? Suppose you wanted to print out (or change) the text of each item, like
Kontrola atrybutowe
,Kontrola 1
,Kontrola 2
, etc. How would you do that? -
Once you have the loop for 1, presumably you know how to call
setCheckState(Qt.Checked)
on each item visited.
-
-
- If put print (QStandardItemModel()) I gain: <PyQt5.QtGui.QStandardItemModel object at 0x00000229EA8F7160>
all data in Tree View come from parsed xml (to variable tree) file (I can't publish them), by
root = tree.getroot()
and later
for grupaKontroli in root: parent = QStandardItem(grupaKontroli.get('name')) QStandardItemModel.appendRow(parent) parent.setCheckable(True) setCheckState(Qt.Checked)
- Answer for that is in function above
This function in the end of main post
- If put print (QStandardItemModel()) I gain: <PyQt5.QtGui.QStandardItemModel object at 0x00000229EA8F7160>
-
- If put print (QStandardItemModel()) I gain: <PyQt5.QtGui.QStandardItemModel object at 0x00000229EA8F7160>
all data in Tree View come from parsed xml (to variable tree) file (I can't publish them), by
root = tree.getroot()
and later
for grupaKontroli in root: parent = QStandardItem(grupaKontroli.get('name')) QStandardItemModel.appendRow(parent) parent.setCheckable(True) setCheckState(Qt.Checked)
- Answer for that is in function above
This function in the end of main post
@Karoluss96
No. I'm afraid you do not seem to have a grasp of models/what is going on. You might benefit from reading up on this in the documentation.The answer to, for example, how do I set every checkbox in my model would be:
for i in range(model.rowCount()): model.item(i).setCheckState(Qt.Checked)
If you want to only check items in and below some one particular node you would need to recurse down its descendants. But you asked for check every item.
- If put print (QStandardItemModel()) I gain: <PyQt5.QtGui.QStandardItemModel object at 0x00000229EA8F7160>
-
Looks useful, pretty and short, but I still didn't see its results- It need to take data from treeView!
-
Looks useful, pretty and short, but I still didn't see its results- It need to take data from treeView!
@Karoluss96 said in (Un)ChechkingAll from Tree View:
It need to take data from treeView!
A
QTreeView
does not store any data. It's a view onto a model. The model is where you store the data. @SGaist has said this, I have said this. I suggested you might like to read up on Qt model/view architecture. -
Please provide a minimal script a minimal script that creates your tree view and its content. We will then be able to reason on it properly to help you achieve your goal.
-
@SGaist said in (Un)ChechkingAll from Tree View:
Please provide a minimal script a minimal script that creates your tree view and its content. We will then be able to reason on it properly to help you achieve your goal.
OK, so I attached it;
def kontrolBDOTread(self): #BDOT is a name of database path = str(self.controlPath).replace('\\','/') + '/' + self.dlg.comboBox_4.currentText() tree = et.parse(path)#parsing XML root = tree.getroot() wersjaSzablonuKontroli = root.get('version') self.dlg.label_8.setText('Wersja szablonu: '+str(wersjaSzablonuKontroli) model = QStandardItemModel() model.setHorizontalHeaderLabels(['Lista kontroli'])#Nagłówek self.dlg.treeView.setModel(model) self.dlg.treeView.setUniformRowHeights(True) i = 0 for grupaKontroli in root: parent = QStandardItem(grupaKontroli.get('name')) model.appendRow(parent) parent.setCheckable(True) parent.setCheckState(Qt.Checked) parent.setUserTristate(True) for kontrola in grupaKontroli: child = QStandardItem(kontrola.get('name')) child.setCheckable(True) child.setCheckState(Qt.Checked) parent.appendRow([child]) self.dlg.treeView.setFirstColumnSpanned(i, self.dlg.treeView.rootIndex(), True) i = i + 1 self.dlg.treeView.show()
-
And how its looks like
-
By minimal script, I meant a script that we can run ourselves on our machines which is not possible with what you posted.
-
Well, it's a UI plugin. It need to be a part of QGIS program (it's free on download by: https://qgis.org/pl/site/forusers/download.html)
-
The fact that you need to write a plugin for QGIS is currently unrelated to your issue hence why I am requesting a minimal script that creates a QTreeView with the model and the buttons you want. With that we can fix the current issue you have and you can then update your plugin code with that.
-
aaaa Ok,
The whole code is too long, as this tab is one of 5 which make this plugin, so I put only that what is here important:def __init__(self, iface): """Constructor. :param iface: An interface instance that will be passed to this class which provides the hook by which you can manipulate the QGIS application at run time. :type iface: QgsInterface """ # Save reference to the QGIS interface self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(__file__) # initialize locale locale = QSettings().value('locale/userLocale')[0:2] locale_path = os.path.join( self.plugin_dir, 'i18n', 'SystemBDOT10k{}.qm'.format(locale)) if os.path.exists(locale_path): self.translator = QTranslator() self.translator.load(locale_path) QCoreApplication.installTranslator(self.translator) # Declare instance attributes self.actions = [] self.menu = self.tr(u'&SystemBDOT10k') # Check if plugin was started the first time in current QGIS session # Must be set in initGui() to survive plugin reloads self.first_start = None # noinspection PyMethodMayBeStatic def tr(self, message): # noinspection PyTypeChecker,PyArgumentList,PyCallByClass return QCoreApplication.translate('SystemBDOT10k', message) def add_action( self, icon_path, text, callback, enabled_flag=True, add_to_menu=True, add_to_toolbar=True, status_tip=None, whats_this=None, parent=None): icon = QIcon(icon_path) action = QAction(icon, text, parent) action.triggered.connect(callback) action.setEnabled(enabled_flag) if status_tip is not None: action.setStatusTip(status_tip) if whats_this is not None: action.setWhatsThis(whats_this) if add_to_toolbar: # Adds plugin icon to Plugins toolbar self.iface.addToolBarIcon(action) if add_to_menu: self.iface.addPluginToMenu( self.menu, action) self.actions.append(action) return action def initGui(self): """Create the menu entries and toolbar icons inside the QGIS GUI.""" icon_path = ':/plugins/SystemBDOT10k/icon.png' self.add_action( icon_path, text=self.tr(u'SystemBDOT10k'), callback=self.run, parent=self.iface.mainWindow()) # will be set False in run() self.first_start = True def unload(self): """Removes the plugin menu item and icon from QGIS GUI.""" for action in self.actions: self.iface.removePluginMenu( self.tr(u'&SystemBDOT10k'), action) self.iface.removeToolBarIcon(action) def run(self): #sources paths self.qmlPath = Path(QgsApplication.qgisSettingsDirPath())/Path("python/plugins/SystemBDOT10k/BDOT10k_QML/") self.mainPath = Path(QgsApplication.qgisSettingsDirPath())/Path("python/plugins/SystemBDOT10k/") self.controlPath = Path(QgsApplication.qgisSettingsDirPath())/Path("python/plugins/SystemBDOT10k/Kontrole/") self.dlg = SystemBDOT10k_dialog() self.dlg.rejected.connect(self.close) self.dlg.pushButton_3.clicked.connect(self.CheckAll) self.dlg.pushButton_4.clicked.connect(self.UncheckAll) #download the names of template of controls filenames = next(walk(self.controlPath), (None, None, []))[2] for filename in filenames: self.dlg.comboBox_4.addItem(filename) self.dlg.comboBox_4.currentTextChanged.connect(self.kontrolBDOTread) self.kontrolBDOTread()
The function kontrolBDOTread attached above my print screen.
-
Please, a minimal script
import sys from QtXxx.QtWidgets import QTableView # additional imports app = QApplication(sys.argv) model = QStandardItemModel() # populate your model table_view = QTableView() table_view.setModel(model) # finish the ui sys.exit(app.exec())