【问题标题】:Draw on QTreeWidget With QPainter使用 QPainter 在 QTreeWidget 上绘图
【发布时间】:2014-11-16 11:15:25
【问题描述】:

我正在开发一个小程序,里面有一堆面板。我想要它,这样当我聚焦到一个面板时,它会在它周围画一条细线以表明它是聚焦的。除了树视图之外,我的所有面板都可以使用它。

这是一个使用QWidget 的示例:

void Test::paintEvent(QPaintEvent *event)
{
    if(hasFocus())
    {
        QPainter painter(this);

        QPen pen(Qt::blue);
        pen.setWidth(1);
        painter.setPen(pen);

        painter.drawRect(geometry());

    }

    QWidget::paintEvent(event);
}

当我在QTreeWidget 上使用QPainter 时,我会在控制台中收到以下调试消息:

  • QWidget::paintEngine:不应再调用
  • QPainter::begin: 绘制设备返回引擎 == 0,类型:1
  • QPainter::setPen: 画家不活跃
  • QPainter::drawRects: 画家不活跃

所以我的问题是我不能将QPainterQTreeWidget 一起使用,所以我无法画出我的轮廓。我可以使用其他方法吗?

【问题讨论】:

  • 为什么不在QTreeWidget 中使用paintEvent?可以调用QTreeWidget::paintEvent(event)进行超类的绘制
  • 这就是我已经在做的事情。我总是在绘画事件中调用超类,但是我确实忘记将它添加到给定的示例中。但这无论如何都不是我的问题。我的问题是我需要围绕 QTreeWidget 的几何图形绘制一个矩形,而仅通过调用超类就无法做到这一点。我需要像 QPainter 之类的东西......
  • 为什么你不能创建一个QPainter呢? QTreeWidget 应该是 QWidget 的子类 ...顺便说一句,您应该在 if 之外添加 QWidget::paintEvent(event)
  • 试试看,你就会明白为什么。我不知道为什么它不会让我,但我在调试输出中得到这些消息。我会将它们添加到问题中
  • 您可以尝试创建自己的小部件并将QTreeWidget 添加到其中,应该可以,但我不知道这是否是最佳选择

标签: c++ qt qpainter qtreewidget


【解决方案1】:

你根本不需要paintEvent。只使用样式表(setStyleSheet() 方法):

QTreeWidget:focus{ border: 1px solid red}
QTreeWidget:!focus{}

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2017-10-27
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多