How to Insert checkbox in root of Qtreeview. Treeview is created by using QDOMDocument reading XML file.
-
@Aviral-0
class DomModel
hasQModelIndex rootIndex() const;
(though can't see an implementation?) orDomItem *rootItem
you can use to identify the root item. -
@JonB I know its alot to ask, but can you tell me what change should I do specifically to make it work. It will be so nice of you taking your time to help me. Thankyou Brother.
-
@Aviral-0
I'm not your Brother!I think you want in
flags()
:DomItem *item = static_cast<DomItem*>(index.internalPointer()); if (item == rootItem) flags |= Qt::ItemIsUserCheckable;
to make it so only the root item is checkable.
-
@Aviral-0
I'm not your Brother!I think you want in
flags()
:DomItem *item = static_cast<DomItem*>(index.internalPointer()); if (item == rootItem) flags |= Qt::ItemIsUserCheckable;
to make it so only the root item is checkable.
-
@Aviral-0
I'm not your Brother!I think you want in
flags()
:DomItem *item = static_cast<DomItem*>(index.internalPointer()); if (item == rootItem) flags |= Qt::ItemIsUserCheckable;
to make it so only the root item is checkable.
@JonB Hi Jon, just one more thing needed.
I want to Highlight the items of tree which is selected, like when we do multiple selection using CTRL button, the selected lines should be in blue highlight or their fonts can done Bold to make selected Items looks different.
How should I do it? any idea ? -
@JonB I have solved this.
By using
DomModel::data(){
if ( role == Qt::CheckStateRole && !index.parent().isValid())
}@Aviral-0 said in How to Insert checkbox in root of Qtreeview. Treeview is created by using QDOMDocument reading XML file.:
&& !index.parent().isValid()
Ah, well done! I kind of thought that was for a child of the root element, and the root element was that parent. But I think it makes sense, I haven't actually ever used
QTreeView
I don't think.Do you mean you only want to alter presentation when multiple items are selected, not just a single one? Normally you would do colour/font via stylesheet on selected items. But that won't distinguish multiple versus single selection.
QTreeView::selectionModel
/selectedIndexes()
gives you which items/indexes are selected, that's all I know, somehow work from there? -
@Aviral-0 said in How to Insert checkbox in root of Qtreeview. Treeview is created by using QDOMDocument reading XML file.:
&& !index.parent().isValid()
Ah, well done! I kind of thought that was for a child of the root element, and the root element was that parent. But I think it makes sense, I haven't actually ever used
QTreeView
I don't think.Do you mean you only want to alter presentation when multiple items are selected, not just a single one? Normally you would do colour/font via stylesheet on selected items. But that won't distinguish multiple versus single selection.
QTreeView::selectionModel
/selectedIndexes()
gives you which items/indexes are selected, that's all I know, somehow work from there?@JonB I am trying this piece of code:
const bool shouldBeBold = (index.column() == 0);
if (role == Qt::FontRole && shouldBeBold) {
QFont boldFont;
boldFont.setBold(true);
return boldFont;
} else {
return DomModel::data(index, role);
}you repied to this code in past at someone elses pproblem.
but its not working -
@JonB I am trying this piece of code:
const bool shouldBeBold = (index.column() == 0);
if (role == Qt::FontRole && shouldBeBold) {
QFont boldFont;
boldFont.setBold(true);
return boldFont;
} else {
return DomModel::data(index, role);
}you repied to this code in past at someone elses pproblem.
but its not working@Aviral-0
Debugging techniques:- Put a
qDebug()
into yourif
statement, does it get hit at all? - Set
shouldBeBold = true
unconditionally, does any items come up in bold? - Try, say,
role == Qt::ForegroundRole
andreturn QColor(Qt::red)
, does that work in case it's some bold issue? - If you are doing this on selected items it might be that selection sets font instead, I don't know.
- Put a
-
@Aviral-0
Debugging techniques:- Put a
qDebug()
into yourif
statement, does it get hit at all? - Set
shouldBeBold = true
unconditionally, does any items come up in bold? - Try, say,
role == Qt::ForegroundRole
andreturn QColor(Qt::red)
, does that work in case it's some bold issue? - If you are doing this on selected items it might be that selection sets font instead, I don't know.
- Put a
-
@Aviral-0
If "nothing worked" that means you are saying your code is not being called at all. I cannot help if you say that is the case. -
@Aviral-0
If "nothing worked" that means you are saying your code is not being called at all. I cannot help if you say that is the case. -
Hi, Hope you are having a good day.
Now I need the checkboxes to all the parents of child.
I have attached the photo attached of what I need.
What to change in the if condition to make it happen?
QVariant DomModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); DomItem *item = static_cast<DomItem*>(index.internalPointer()); const QDomNode node = item->node(); //if ( role == Qt::CheckStateRole && !index.parent().isValid()) //if ( role == Qt::CheckStateRole && index.column() == 0 && !index.parent().isValid()) if ( role == Qt::CheckStateRole && index.column() == 0 && !index.parent().isValid() ) { return static_cast< int >( item->isChecked() ? Qt::Checked : Qt::Unchecked ); } if (role != Qt::DisplayRole) return QVariant(); switch (index.column()) { case 0: return node.nodeName(); case 1: { const QDomNamedNodeMap attributeMap = node.attributes(); QStringList attributes; for (int i = 0; i < attributeMap.count(); ++i) { QDomNode attribute = attributeMap.item(i); attributes << attribute.nodeName() + "=\"" + attribute.nodeValue() + '"'; } return attributes.join(' '); } case 2: return node.nodeValue().split('\n').join(' '); default: break; } return item->data(index.column()); }
-
Hi, Hope you are having a good day.
Now I need the checkboxes to all the parents of child.
I have attached the photo attached of what I need.
What to change in the if condition to make it happen?
QVariant DomModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); DomItem *item = static_cast<DomItem*>(index.internalPointer()); const QDomNode node = item->node(); //if ( role == Qt::CheckStateRole && !index.parent().isValid()) //if ( role == Qt::CheckStateRole && index.column() == 0 && !index.parent().isValid()) if ( role == Qt::CheckStateRole && index.column() == 0 && !index.parent().isValid() ) { return static_cast< int >( item->isChecked() ? Qt::Checked : Qt::Unchecked ); } if (role != Qt::DisplayRole) return QVariant(); switch (index.column()) { case 0: return node.nodeName(); case 1: { const QDomNamedNodeMap attributeMap = node.attributes(); QStringList attributes; for (int i = 0; i < attributeMap.count(); ++i) { QDomNode attribute = attributeMap.item(i); attributes << attribute.nodeName() + "=\"" + attribute.nodeValue() + '"'; } return attributes.join(' '); } case 2: return node.nodeValue().split('\n').join(' '); default: break; } return item->data(index.column()); }
-
@Aviral-0
So change the&& !index.parent().isValid()
, which you put in to make it root-only, to whatever it is you want to show checkboxes against? -
@JonB Please look at the image I jhave attached!
Image(https://wetransfer.com/downloads/a9b408bd97b18185f4fc64ac8053fbb520221205051935/8f1754)@Aviral-0
Then upload an image to your post (best, the post toolbar has "cloud" icon tooltip Upload Image), or at worst given a link to where the image can be seen. If you think I am going to download an image you want me to look at from a site , I am not. -
@Aviral-0
Then upload an image to your post (best, the post toolbar has "cloud" icon tooltip Upload Image), or at worst given a link to where the image can be seen. If you think I am going to download an image you want me to look at from a site , I am not. -
@Aviral-0
[I presume you also want a checkbox against the devices node.] So you want a checkbox against each node in the tree, but not against leaves? So check to see (indata()
) whether theDomItem item
for theindex
has any children or not.