Отображение включено QCheckBox как отключено

Я использую QTreeView с TreeModel (который наследует QAbstractItemModel). Функция TreeModel :: flags () возвращает Qt :: ItemIsUserCheckable, и поэтому отображается флажок рядом с каждым элементом в представлении.
Что мне нужно сделать, это отобразить флажок как отключенный, когда родительский элемент не отмечен, но пользователь должен иметь возможность нормально с ним взаимодействовать (флажок должен быть включен).

Я попытался реализовать пользовательский QStyledItemDelegate и нарисовал флажок самостоятельно. Однако я не знаю, как использовать пользовательские изображения при рисовании флажка в функции draw () делегата. Я даже не знаю, является ли это правильным способом сделать это.

Я также думал о том, чтобы как-то использовать таблицы стилей, но отображение флажка зависит от данных модели (если установлен родитель или нет).

Есть идеи?

Это моя функция ItemDelegate :: paint ().

void ItemDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::DisplayRole).toInt();

QStyleOptionButton check_box_style_option;

check_box_style_option.state |= QStyle::State_Enabled;

if (value == 1)
check_box_style_option.state |= QStyle::State_On;
else
check_box_style_option.state |= QStyle::State_Off;

check_box_style_option.rect = option.rect;QApplication::style()->drawControl(QStyle::CE_CheckBox,
&check_box_style_option, painter);
}
[Редактировать] TreeModel код. Модель дерева основана на примере «simpletreemodel». Я изменил flags (), чтобы он также возвращал Qt :: ItemIsUserCheckable и data (), setData (), чтобы включить или отключить флажки.

#include <QtGui>
#include <QDebug>
#include "treeitem.h"#include "treemodel.h"
TreeModel::TreeModel(Container *data, QObject *parent)
: QAbstractItemModel(parent)
{
root_item_ = new TreeItem("");
SetupModelData(data, root_item_);
}

TreeModel::~TreeModel()
{
delete root_item_;
}

int TreeModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return static_cast<TreeItem*>(parent.internalPointer())->columnCount();
else
return root_item_->columnCount();
}

QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

TreeItem *item = static_cast<TreeItem*>(index.internalPointer());

if(role == Qt::CheckStateRole && index.column() == 0)
return static_cast<int>(item->checked()) ? Qt::Checked : Qt::Unchecked;

if(role != Qt::DisplayRole)
return QVariant();

return item->data(index.column());
}

bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());

if(role == Qt::CheckStateRole)
item->set_checked(!item->checked());

if(role == Qt::EditRole)
{
qDebug() << "value:" << value.toString();
item->set_data(value.toString());
}

emit dataChanged(index, index);

return true;
}

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;

return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
}

QVariant TreeModel::headerData(int section, Qt::Orientation orientation,
int role) const
{
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
return root_item_->data(section);

return QVariant();
}

QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
const
{
if (!hasIndex(row, column, parent))
return QModelIndex();

TreeItem *parentItem;

if (!parent.isValid())
parentItem = root_item_;
else
parentItem = static_cast<TreeItem*>(parent.internalPointer());

TreeItem *childItem = parentItem->child(row);
if (childItem)
return createIndex(row, column, childItem);
else
return QModelIndex();
}

QModelIndex TreeModel::parent(const QModelIndex &index) const
{
if (!index.isValid())
return QModelIndex();

TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());
TreeItem *parentItem = childItem->parent();

if (parentItem == root_item_)
return QModelIndex();

return createIndex(parentItem->row(), 0, parentItem);
}

int TreeModel::rowCount(const QModelIndex &parent) const
{
TreeItem *parentItem;
if (parent.column() > 0)
return 0;

if (!parent.isValid())
parentItem = root_item_;
else
parentItem = static_cast<TreeItem*>(parent.internalPointer());

return parentItem->childCount();
}

void TreeModel::SetupModelData(Container *data, TreeItem *parent)
{
TreeItem *new_item = new TreeItem(data->id(), parent);
data->set_tree_item(new_item);
parent->appendChild(new_item);

foreach(Container *child, data->children())
SetupModelData(child, new_item);
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector