Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用QModelIndex设置QTreeWidgetItem的背景_C++_Qt4_Contextmenu_Qtreeview_Qtreewidgetitem - Fatal编程技术网

C++ 使用QModelIndex设置QTreeWidgetItem的背景

C++ 使用QModelIndex设置QTreeWidgetItem的背景,c++,qt4,contextmenu,qtreeview,qtreewidgetitem,C++,Qt4,Contextmenu,Qtreeview,Qtreewidgetitem,我有一个带有qTreeWidget的主窗口。要将元素添加到此小部件,我实现了以下功能: QTreeWidgetItem *MainWindow::prepareIt(QTreeWidgetItem *it, const QString &name, const QString &descr) { it->setText(0, name); it->setText(1, descr); return it; } QTreeWidgetItem

我有一个带有qTreeWidget的主窗口。要将元素添加到此小部件,我实现了以下功能:

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中的一些条目。在我的主窗口的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();
    }
}
void主窗口::右键单击(常量QPoint&pt)
{
QModelIndex idx=ui->treeWidget->indexAt(pt);
if(idx.isValid())
{

qDebug()更改单元格的颜色:

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

void主窗口::右键单击(常量QPoint&pt)
{
QModelIndex idx=ui->treeWidget->indexAt(pt);
if(idx.isValid())
{
ui->treeWidget->model()->setData(idx,QColor(“红色”),Qt::BackgroundRole);
}
}
但这只会更改一个单元格,如果要更改颜色,则必须遍历整行:

更改行颜色:

void主窗口::右键单击(常量QPoint&pt)
{
QModelIndex idx=ui->treeWidget->indexAt(pt);
if(idx.isValid())
{
对于(int c=0;ctreeWidget->columnCount();++c){
QModelIndex ix=idx.sibling(idx.row(),c);
ui->treeWidget->model()->setData(ix,QColor(“红色”),Qt::BackgroundRole);
}
}
}
或:

void主窗口::右键单击(常量QPoint&pt)
{
QTreeWidgetItem*it=ui->treeWidget->itemAt(pt);
如果(它)
{
对于(int c=0;ctreeWidget->columnCount();++c){
它->背景色(c,QColor(“红色”));
}
}
}

更改单元格的颜色:

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

void主窗口::右键单击(常量QPoint&pt)
{
QModelIndex idx=ui->treeWidget->indexAt(pt);
if(idx.isValid())
{
ui->treeWidget->model()->setData(idx,QColor(“红色”),Qt::BackgroundRole);
}
}
但这只会更改一个单元格,如果要更改颜色,则必须遍历整行:

更改行颜色:

void主窗口::右键单击(常量QPoint&pt)
{
QModelIndex idx=ui->treeWidget->indexAt(pt);
if(idx.isValid())
{
对于(int c=0;ctreeWidget->columnCount();++c){
QModelIndex ix=idx.sibling(idx.row(),c);
ui->treeWidget->model()->setData(ix,QColor(“红色”),Qt::BackgroundRole);
}
}
}
或:

void主窗口::右键单击(常量QPoint&pt)
{
QTreeWidgetItem*it=ui->treeWidget->itemAt(pt);
如果(它)
{
对于(int c=0;ctreeWidget->columnCount();++c){
它->背景色(c,QColor(“红色”));
}
}
}

这比我想象的要简单得多:)非常感谢!@Cherubim如果我的回答对你有帮助,那么不要忘记标记为正确,如果你不知道如何做,那么请检查抱歉,我以为我已经单击了,但corona home office vpn太慢了。无论如何,再次感谢,现在它应该标记为正确。这比我想象的要简单得多:)非常感谢!@Cherubim如果我的回答对你有帮助,那么别忘了标记为正确,如果你不知道怎么做,那么请检查“对不起,我以为我已经单击了它,但是corona home office vpn太慢了。无论如何,再次感谢,现在它应该标记为正确。
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"));
        }
    }
}