使用 QModelIndex 设置 QTreeWidgetItem 的背景
use QModelIndex to set background of a QTreeWidgetItem
我有带有 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 中的一些条目。在我的主窗口的 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 以进行突出显示?还是有其他方法可以使元素突出显示/更改元素的颜色?
提前致谢!!
更改单元格的颜色:
一个可能的解决方案是使用 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"));
}
}
}
我有带有 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 中的一些条目。在我的主窗口的 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 以进行突出显示?还是有其他方法可以使元素突出显示/更改元素的颜色?
提前致谢!!
更改单元格的颜色:
一个可能的解决方案是使用 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"));
}
}
}