Если я убираю с ветки Qt::ItemIsTristate, то она (ветка) никогда и не становится PartiallyChecked, даже когда половина детей отмечана, а половина не отмечена.
Ну вот собственно говоря. Простенький пример с которым я играюсь:
#include <QtGui>
#include <QtWidgets>
class TestWindow: public QWidget {
QTreeWidget *tree;
public:
TestWindow(QWidget *parent = 0);
~TestWindow() {delete tree;}
};
TestWindow::TestWindow(QWidget *parent) : QWidget(parent) {
tree = new QTreeWidget();
tree->setHeaderHidden(true);
tree->setRootIsDecorated(true);
QTreeWidgetItem *twiAll;
twiAll = new QTreeWidgetItem();
twiAll->setText(0,"all");
twiAll->setCheckState(0, Qt::Unchecked);
twiAll->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate);
tree->addTopLevelItem(twiAll);
twiAll->setExpanded(true);
QTreeWidgetItem *twiParent = new QTreeWidgetItem();
twiParent->setText(0,"Parent 1");
twiParent->setCheckState(0, Qt::Unchecked);
twiParent->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate);
twiAll->addChild(twiParent);
twiParent->setExpanded(true);
QTreeWidgetItem *twiChild = new QTreeWidgetItem();
twiChild->setText(0, "child a");
twiChild->setCheckState(0, Qt::Unchecked);
twiChild->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
twiParent->addChild(twiChild);
twiChild = new QTreeWidgetItem();
twiChild->setText(0, "child b");
twiChild->setCheckState(0, Qt::Unchecked);
twiChild->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
twiParent->addChild(twiChild);
twiParent = new QTreeWidgetItem();
twiParent->setText(0,"Parent 2");
twiParent->setCheckState(0, Qt::Unchecked);
twiParent->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate);
twiAll->addChild(twiParent);
twiParent->setExpanded(true);
twiChild = new QTreeWidgetItem();
twiChild->setText(0, "child c");
twiChild->setCheckState(0, Qt::Unchecked);
twiChild->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
twiParent->addChild(twiChild);
twiChild = new QTreeWidgetItem();
twiChild->setText(0, "child d");
twiChild->setCheckState(0, Qt::Unchecked);
twiChild->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
twiParent->addChild(twiChild);
QVBoxLayout *vlayout = new QVBoxLayout();
vlayout->addWidget(tree);
this->setLayout(vlayout);
tree->setCurrentItem(tree->topLevelItem(0));
}
int main(int argc, char **argv) {
QApplication a(argc, argv);
TestWindow *window = new TestWindow();
window->show();
return a.exec();
}
При смене галочек на "child" элементах, галочки на "parent" и "all" ведут себя правильно. А клики на "parent" и "all" ведут себя не правильно...
Попробуйте пожалуйста этот код на Qt ранее чем 5.2, может это свеженький баг? В принципе я могу попробовать откатится на 4.8, но не уверен стоит ли.
Может кто-нибудь писал правильно ведущую себя checkbox-tree модель?