更改QRubberBand的颜色

时间:2011-11-15 16:56:46

标签: qt qt4

我正在尝试更改QRubberBand的颜色。我试过这个:

QRubberBand* rubberBand = new QRubberBand(QRubberBand::Rectangle, this->graphicsView);
QPalette palette;
palette.setBrush(QPalette::Foreground, QBrush(Qt::green));
palette.setBrush(QPalette::Base, QBrush(Qt::red));

rubberBand->setPalette(palette);

rubberBand->resize(30, 30);
rubberBand->show();

但出现的橡皮带是标准的黑色点缀。关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:6)

实际渲染取决于平台,但对于Windows(可能是其他人),您可以设置QPalette::Highlight颜色角色。这个例子有效:

#include <QtGui>

int main(int argc, char **argv) {
  QApplication app(argc, argv);
  QRubberBand band(QRubberBand::Rectangle);

  QPalette pal;
  pal.setBrush(QPalette::Highlight, QBrush(Qt::red));
  band.setPalette(pal);

  band.resize(30, 30);
  band.show();
  return app.exec();
}

如果您使用的是其他平台,请告诉我,我可以看到该平台的功能。

然而,既然您参考了图形视图,我想知道您是否指出所选项目周围出现的黑色虚线?这是完全不同的东西,根本不涉及QRubberBand。如果是这种情况,您可能需要更新问题。

顺便说一句,我看了QWindowsVistaStyle的代码来追查答案。如果您在不同的平台上并且可以访问源,则可以查看该平台的正确样式类。

更新看起来你对Ubuntu运气不好。这使用QCleanLooksStyle,其中QWindowsStyle为橡皮筋。在那里,颜色是硬编码的:

QPixmap tiledPixmap(16, 16);
QPainter pixmapPainter(&tiledPixmap);
pixmapPainter.setPen(Qt::NoPen);
pixmapPainter.setBrush(Qt::Dense4Pattern);
pixmapPainter.setBackground(Qt::white);
pixmapPainter.setBackgroundMode(Qt::OpaqueMode);
pixmapPainter.drawRect(0, 0, tiledPixmap.width(), tiledPixmap.height());
... etc ...

此外,Qt Style Sheets Reference不会将QRubberBand列为服从任何样式。如果您确实需要不同的颜色,那么您唯一的选择可能是继承QRubberBand并实施paintEvent。长号。

答案 1 :(得分:4)

最简单的方法是使用QGraphicsColorEffect,如下所示:

QGraphicsColorizeEffect *e = new QGraphicsColorizeEffect(rubberBand_);
e->setColor(QColor("red"));
rubberBand_->setGraphicsEffect(e);

然而,在Qt 4.8中不推荐使用QGraphicsEffects,原因是“设计有缺陷”。在我的项目中广泛使用颜色和阴影效果来渲染非窗口小部件项目,菜单和字体。我希望诺基亚在弃用整个功能之前提供同等的解决方案。