首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何立即检测QTreeView中的复选框状态更改?

如何立即检测QTreeView中的复选框状态更改?
EN

Stack Overflow用户
提问于 2019-06-02 09:36:27
回答 1查看 496关注 0票数 1

我在linux上使用Qt 5.9。我有一个QTreeView,我在其中设置了一个从QAbstractItemModel派生的自定义模型,并用树项目的几个普通类填充了树。每个treeview项目旁边都有一个复选框。

我在QTreeView上设置了以下属性...

代码语言:javascript
运行
复制
treeView->viewport()->setAttribute(Qt::WA_Hover);

因此,当鼠标悬停在树项目上时,我可以通过我的委托paint方法来捕获事件。

问题是,我在每个树项目中也有一个复选框,我希望能够在复选框的状态发生变化时捕获它,但我的代理似乎没有捕获到这一点。当我将鼠标悬停在项目上时,我可以知道复选框处于什么状态,但我想要的是能够立即知道复选框的状态何时发生变化,而不需要进一步移动鼠标。

关于如何在树项目中立即检测复选框状态的更改,您有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-02 15:26:06

一种可能的解决方案是使用editorEvent方法跟踪复选框的状态更改:

代码语言:javascript
运行
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56411646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档