首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QModelIndex设置QTreeWidgetItem的背景

使用QModelIndex设置QTreeWidgetItem的背景
EN

Stack Overflow用户
提问于 2020-03-19 10:10:43
回答 1查看 130关注 0票数 1

我有MainWindow和qTreeWidget。为了向这个小部件添加元素,我实现了以下函数:

代码语言:javascript
复制
QTreeWidgetItem *MainWindow::prepareIt(QTreeWidgetItem *it, const QString &name, const QString &descr)
{
    it->setText(0, name);
    it->setText(1, descr);
    return it;
}

QTreeWidgetItem *MainWindow::addRoot(const QString &name, const QString &descr)
{
    QTreeWidgetItem *it = prepareIt(new QTreeWidgetItem(ui->treeWidget), name, descr);
    it->setBackground( 0, QColor{112, 77, 75} );
    it->setBackground( 1, QColor{78, 90, 110} );
    return it;
}

QTreeWidgetItem *MainWindow::addChild(QTreeWidgetItem *parent, const QString &name, const QString &descr)
{
    auto child = new QTreeWidgetItem(parent);

    child->setBackground( 0, QColor{102, 67, 65} );
    child->setBackground( 1, QColor{68, 80, 99} );

    parent->addChild(prepareIt(child, name, descr));
    return child;
}


...
addRoot(...);
addChild(parent,...);
...

它如预期的那样工作。现在,我想用鼠标右键突出显示这个qTreeWidget中的一些入口。在我的MainWindow的C中,我实现了:

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ...
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->treeWidget, SIGNAL (customContextMenuRequested(const QPoint &)), this, SLOT (rightClick(const QPoint &)));
    ...
}

这个槽是

代码语言:javascript
复制
void MainWindow::rightClick(const QPoint &pt)
{
    QModelIndex idx = ui->treeWidget->indexAt(pt);
    if (idx.isValid())
    {
        qDebug() << idx.data().toString();
        qDebug() << idx << "index.row()" << idx.row() << " index.column()" << idx.column();
    }
}

按预期调用插槽( qDebug工作),但是如何从QModelIndex idx获得相应的QTreeWidgetItem以进行高亮显示?或者有其他方法可以使元素的颜色变得更高/改变颜色呢?

提前谢谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-19 11:51:12

更改单元格的颜色:

一个可能的解决方案是使用setData()方法:

代码语言:javascript
复制
void MainWindow::rightClick(const QPoint &pt)
{
    QModelIndex idx = ui->treeWidget->indexAt(pt);
    if (idx.isValid())
    {
        ui->treeWidget->model()->setData(idx, QColor("red"), Qt::BackgroundRole);
    }
}

但这只会改变一个单元格,如果要更改颜色,则必须遍历整个行:

更改行颜色:

代码语言:javascript
复制
void MainWindow::rightClick(const QPoint &pt)
{
    QModelIndex idx = ui->treeWidget->indexAt(pt);
    if (idx.isValid())
    {
        for(int c=0; c < ui->treeWidget->columnCount(); ++c){
            QModelIndex ix = idx.sibling(idx.row(), c);
            ui->treeWidget->model()->setData(ix, QColor("red"), Qt::BackgroundRole);
        }
    }
}

或者:

代码语言:javascript
复制
void MainWindow::rightClick(const QPoint &pt)
{
    QTreeWidgetItem *it = ui->treeWidget->itemAt(pt);
    if (it)
    {
        for(int c=0; c < ui->treeWidget->columnCount(); ++c){
            it->setBackground(c, QColor("red"));
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60754934

复制
相关文章

相似问题

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