【问题标题】:use QModelIndex to set background of a QTreeWidgetItem使用 QModelIndex 设置 QTreeWidgetItem 的背景
【发布时间】:2020-06-30 10:56:11
【问题描述】:

我有一个带有 qTreeWidget 的 MainWindow。为了向这个小部件添加元素,我实现了这个功能:

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-Tor 中:

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 &)));
    ...
}

插槽是

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 以突出显示?还是有另一种方法可以使高亮/改变元素的颜色?

提前致谢!!

【问题讨论】:

    标签: c++ qt4 contextmenu qtreeview qtreewidgetitem


    【解决方案1】:

    改变单元格的颜色:

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

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

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

    更改行颜色:

    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);
            }
        }
    }
    

    或者:

    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"));
            }
        }
    }
    

    【讨论】:

    • 这比我预期的要简单得多 :) 非常感谢!
    • @Cherubim 如果我的回答对您有所帮助,请不要忘记标记为正确,如果您不知道该怎么做,请查看tour
    • 对不起,我以为我点击了它,但电晕家庭办公室 vpn 太慢了。无论如何再次感谢,现在它应该被标记为正确。
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2023-03-25
    • 2020-01-07
    • 2019-07-27
    • 2021-04-27
    • 2011-02-14
    相关资源
    最近更新 更多