qt - 如何立即检测 QTreeView 中的复选框状态变化?
问题描述
我在 Linux 上使用 Qt 5.9。我有一个 QTreeView ,我在其中设置了一个从 QAbstractItemModel 派生的自定义模型,并用几个普通的树项类填充树。每个树视图项目旁边都有一个复选框。
我在 QTreeView 上设置了以下属性...
treeView->viewport()->setAttribute(Qt::WA_Hover);
这样当鼠标悬停在树项上时,我可以通过我的代表绘制方法捕获事件。
问题是我在每个树项中也有一个复选框,我希望能够在复选框的状态发生变化时进行捕捉,但我的代表似乎没有捕捉到这一点。当我将鼠标悬停在项目上时,我可以知道复选框处于什么状态,但我想要的是能够立即知道复选框的状态何时发生变化,而无需进一步移动鼠标。
关于如何立即检测树项中复选框状态何时更改的任何想法?
解决方案
一种可能的解决方案是使用 editorEvent 方法跟踪复选框的状态变化:
#include <QtWidgets>
class CheckboxDelegate: public QStyledItemDelegate{
Q_OBJECT
public:
using QStyledItemDelegate::QStyledItemDelegate;
bool editorEvent(QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index) override
{
Qt::CheckState last = static_cast<Qt::CheckState>(model->data(index, Qt::CheckStateRole).toInt());
bool res = QStyledItemDelegate::editorEvent(event, model, option, index);
Qt::CheckState current = static_cast<Qt::CheckState>(model->data(index, Qt::CheckStateRole).toInt());
if(last != current)
Q_EMIT stateChanged(index);
return res;
}
Q_SIGNALS:
void stateChanged(const QModelIndex & index);
};
#include "main.moc"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStandardItemModel model;
model.setColumnCount(2);
for(int i=0; i<4; ++i){
QList<QStandardItem *> l;
for (int c=0; c< model.columnCount(); ++c) {
QStandardItem *parent = new QStandardItem(QString("%1-%2").arg(i).arg(c));
parent->setCheckable(true);
l << parent;
for (int j=0; j<4; ++j) {
QList<QStandardItem *> ll;
for (int c=0; c< model.columnCount(); ++c) {
QStandardItem *child = new QStandardItem(QString("%1-%2-%3").arg(i).arg(j).arg(c));
child->setCheckable(true);
ll << child;
}
parent->appendRow(ll);
}
}
model.appendRow(l);
}
QTreeView w;
w.viewport()->setAttribute(Qt::WA_Hover);
CheckboxDelegate *delegate = new CheckboxDelegate(&w);
w.setItemDelegate(delegate);
QObject::connect(delegate, &CheckboxDelegate::stateChanged, [](const QModelIndex & index){
QString text = index.data().toString();
Qt::CheckState state = static_cast<Qt::CheckState>(index.data(Qt::CheckStateRole).toInt());
qDebug() << text << state;
});
w.setModel(&model);
w.resize(640, 480);
w.expandAll();
w.show();
return a.exec();
}
推荐阅读
- parsing - 从字符串解析浮点数(v-lang)
- objective-c - NSLayoutManager 字形生成和插入符号位置
- node.js - 节点测试模块返回测试错误
- python - 有限制的排列
- html - 我可以为同一个 url .htaccess 使用多个 RewriteRules
- android-studio - 如何在 KOTLIN 中制作动态 URL 端点
- python - K8s Ingress 背后的 Falcon 和 Daphne 的 Websockets
- go - 在 Wire Dependency Injection 中创建 Per-Provider Loggers
- php - 使用 Laravel 8 具有特定列的 GroupBy 数据
- python - 在 Python 中比较日期对象