PDA

View Full Version : Disable Single Checkbox in QTreeWidgetItem



deepal_de
27th April 2011, 07:15
Hello,

Any one know a way to disable a single chekbox in Qtreewidget.
i Have list of QTreeWidgetItem*, all are in Qt::Unchecked state;
i need to disbale few chekbox's.
When i use QTreeWidgetItem::SetFlags(Qt::ItemIsEditable), checkbox's in complete row change to disable mode. :(
How can i disable only one chekbox in QTreeWidgetItem.

Thanks

high_flyer
28th April 2011, 11:07
When i use QTreeWidgetItem::SetFlags(Qt::ItemIsEditable), checkbox's in complete row change to disable mode.
Please post relevant code.

deepal_de
5th May 2011, 14:18
--------------------------------------------H---------------------------------------------------


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void initTree();

private:
Ui::MainWindow *ui;

private slots:

};

#endif // MAINWINDOW_H

------------------------------------CPP-----------------------------------------------------


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include "MyStyle.h"
#include <QMultiMap>

QTreeWidget* pTree;
QList<QTreeWidgetItem*> lstWidgets;
QList<QTreeWidgetItem*> lstSubItems;


MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
pTree = NULL;
initTree();
QSize size(540,870);
this->resize(size);
this->setMinimumSize(size);
this->setMaximumSize(size);
ui->gridLayout->addWidget(pTree);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::initTree()
{
pTree = new QTreeWidget(this);
pTree->setGeometry(10,10,520,850);
pTree->setMaximumSize(520,850);
pTree->show();

QStringList lstheadrs;
lstheadrs.append(" \n \n \n \n \n \n ");
lstheadrs.append("1");
lstheadrs.append("2");
lstheadrs.append("3");
lstheadrs.append("4");
lstheadrs.append("5");
lstheadrs.append("6");
lstheadrs.append("7");
lstheadrs.append("8");
lstheadrs.append("9");
lstheadrs.append("10");
lstheadrs.append("11");
lstheadrs.append("12");
pTree->setHeaderLabels(lstheadrs);
//------SET COLUMN WIDTH---------------
pTree->setColumnWidth(0,190);
for(int i = 1; i<=12; i++)
{
pTree->setColumnWidth(i,25);
}
MyStyle *headerStyl = new MyStyle(this->style());
pTree->setStyle(headerStyl);

//================================================== ================================================== ======//
QTreeWidgetItem *Node1 = new QTreeWidgetItem(pTree, QStringList(QObject::tr("1")));
Node1->addChild(new QTreeWidgetItem(QStringList(QObject::tr("1.1"))));
Node1->addChild(new QTreeWidgetItem(QStringList(QObject::tr("1.2"))));
Node1->addChild(new QTreeWidgetItem(QStringList(QObject::tr("1.3"))));
pTree->expandItem(Node1);
for(int iChild=0; iChild<Node1->childCount() ; iChild++)
for(int i=1; i<lstheadrs.length(); i++)
Node1->child(iChild)->setCheckState(i,Qt::Unchecked);

lstWidgets.append(Node1);
//================================================== ================================================== ======//
QTreeWidgetItem *Node2 = new QTreeWidgetItem(pTree, QStringList(QObject::tr("2")));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.1"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.2"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.3"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.4"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.5"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.6"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.7"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.8"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.9"))));
Node2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("2.10"))));
pTree->expandItem(Node2);
for(int iChild=0; iChild<Node2->childCount() ; iChild++)
for(int i=1; i<lstheadrs.length(); i++)
Node2->child(iChild)->setCheckState(i,Qt::Unchecked);

lstWidgets.append(Node2);
//================================================== ================================================== ======//
QTreeWidgetItem *Node3 = new QTreeWidgetItem(pTree,QStringList(QObject::tr("3")));

QTreeWidgetItem *node3sub1 = new QTreeWidgetItem(Node3, QStringList(QObject::tr("3.1")));
node3sub1->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.1.1"))));
node3sub1->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.1.2"))));
node3sub1->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.1.3"))));
Node3->addChild(node3sub1);
for(int iChild=0; iChild<node3sub1->childCount(); iChild++)
for(int i=1; i<lstheadrs.length(); i++)
node3sub1->child(iChild)->setCheckState(i,Qt::Unchecked);

QTreeWidgetItem *node3sub2 = new QTreeWidgetItem(Node3, QStringList(QObject::tr("3.2")));
node3sub2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.2.1"))));
node3sub2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.2.2"))));
node3sub2->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.2.3"))));
Node3->addChild(node3sub2);
for(int iChild=0; iChild<node3sub2->childCount(); ++iChild)
for(int i=1; i<lstheadrs.length(); i++)
node3sub2->child(iChild)->setCheckState(i,Qt::Unchecked);

QTreeWidgetItem *node3sub3 = new QTreeWidgetItem(Node3, QStringList(QObject::tr("3.3")));
node3sub3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.3.1"))));
node3sub3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.3.2"))));
node3sub3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.3.3"))));
Node3->addChild(node3sub3);
for(int iChild=0; iChild<node3sub3->childCount(); iChild++)
for(int i=1; i<lstheadrs.length(); i++)
node3sub3->child(iChild)->setCheckState(i,Qt::Unchecked);


Node3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.4"))));
Node3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.5"))));
Node3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.6"))));
Node3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.7"))));
Node3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.8"))));
Node3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.9"))));
Node3->addChild(new QTreeWidgetItem(QStringList(QObject::tr("3.10"))));

pTree->expandItem(Node3);
for(int iChild=0; iChild<Node3->childCount() ; iChild++)
for(int i=1; i<lstheadrs.length(); i++)
Node3->child(iChild)->setCheckState(i,Qt::Unchecked);

lstWidgets.append(Node3);
lstWidgets.append(node3sub1);
lstWidgets.append(node3sub2);
lstWidgets.append(node3sub3);
//================================================== ================================================== ======//
QTreeWidgetItem *node4 = new QTreeWidgetItem(pTree, QStringList(QObject::tr("4")));
node4->addChild(new QTreeWidgetItem(QStringList(QObject::tr("4.1"))));
node4->addChild(new QTreeWidgetItem(QStringList(QObject::tr("4.2"))));
pTree->expandItem(node4);
for(int iChild=0; iChild<node4->childCount() ; iChild++)
for(int i=1; i<lstheadrs.length(); i++)
node4->child(iChild)->setCheckState(i,Qt::Unchecked);

lstWidgets.append(node4);
//================================================== ================================================== ======//
QTreeWidgetItem *node5 = new QTreeWidgetItem(pTree, QStringList(QObject::tr("5")));
node5->addChild(new QTreeWidgetItem(QStringList(QObject::tr("5.1"))));
node5->addChild(new QTreeWidgetItem(QStringList(QObject::tr("5.2"))));
node5->addChild(new QTreeWidgetItem(QStringList(QObject::tr("5.3"))));
node5->addChild(new QTreeWidgetItem(QStringList(QObject::tr("5.4"))));
pTree->expandItem(node5);
for(int iChild=0; iChild<node5->childCount() ; iChild++)
for(int i=1; i<lstheadrs.length(); i++)
node5->child(iChild)->setCheckState(i,Qt::Unchecked);

lstWidgets.append(node5);
}



This Code will generate a treeviwe, i need to disable only few checkboxes.
for example chekbox at index (1,3) (1,4),(1,5) (2,2),(2,5),(2,6) like vis.

But time to time the disable checkbox index may change,
disabled indexed previously will be active at the next viwe.
how can i contol this.

Note : lstWidgets has all the row items...

high_flyer
5th May 2011, 15:18
When i use QTreeWidgetItem::SetFlags(Qt::ItemIsEditable), checkbox's in complete row change to disable mode.
Where in the code you posted you call setFlags()?


This Code will generate a treeviwe, i need to disable only few checkboxes.
for example chekbox at index (1,3) (1,4),(1,5) (2,2),(2,5),(2,6) like vis.
So I take it that you know how to do this part?


But time to time the disable checkbox index may change,
disabled indexed previously will be active at the next viwe.
how can i contol this.
not sure what you mean, can you give a use case example?

deepal_de
7th May 2011, 07:42
Thanks for replying.



MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
pTree = NULL;
initTree();
QSize size(540,870);
this->resize(size);
this->setMinimumSize(size);
this->setMaximumSize(size);
ui->gridLayout->addWidget(pTree);

// Add this 3 lines to the code
////////////////////////////////////////////////////////////////////////////
Line 1)
lstWidgets.at(2)->child(5)->setCheckState(4,Qt::Checked);
Line 2)
lstWidgets.at(2)->child(4)->setFlags(Qt::ItemIsEditable);
Line 3)
// lstSubItems.at(5)->setFlags(Qt::ItemIsEditable);

//////////////////////////////////////////////////////////////////////////////
}


1)
after adding the (Line1) and running the program u will have Qtree with only one item in Qt::checked state.
what i wont to know is how to disable this checkbox so users cant change this.

when i try to use setFlags....
2)
after adding the (Line2) you will find that the full line at given index changes to disable state
3)
Line 3 Gives a runtime error

MarekR22
7th May 2011, 13:38
http://doc.trolltech.com/latest/qt.html#ItemFlag-enum
Qt::ItemIsEnabled

ChristianSeverin
16th May 2011, 11:08
http://doc.trolltech.com/latest/qt.html#ItemFlag-enum
Qt::ItemIsEnabled

If I understood the OP correctly, deepal_de only wants to disable the checkbox, not the whole item row.

deepal_de
25th May 2011, 09:09
Yes thats correct :)

MarekR22
25th May 2011, 09:27
Ok I should also give this link: QAbstractItemModel::flags (http://doc.qt.nokia.com/latest/qabstractitemmodel.html#flags). Check QStandardItem::setFlags (http://doc.qt.nokia.com/latest/qstandarditem.html#setFlags) if you use standard model (QStandardItemModel).
Just in case take a look also here:
QAbstractItemModel::data (http://doc.qt.nokia.com/latest/qabstractitemmodel.html#data) Qt::ItemDataRole-enum (http://doc.qt.nokia.com/latest/qt.html#ItemDataRole-enum) see Qt::CheckStateRole