【问题标题】:Paint over top of label, not behind it in Qt在标签顶部绘制,而不是在 Qt 中绘制
【发布时间】:2015-03-09 16:12:17
【问题描述】:

我正在 Qt 4.7.4 中创建一个简单的仪表,一切都运行良好。除了这样一个事实,在我的一生中,当它经过它们时,我无法让表盘形状在文本标签上绘制。它总是把它画在标签后面。我只是使用一个简单的drawpolygon() 方法。

我认为这与绘画事件有关?我在MainWindow 中绘制QFrame 中的所有内容。我正在使用QFramepaintEvent

编辑: QLabel 是在使用新的 QLabel(this) 启动时创建的。它们只被创建一次,并且再也不会被触及(类似于使用 Designer 在 Ui 上手动添加它们)。 drawpolygon() 在 QFrame 的 Paint 事件中。

“myclass.h”

    class gauge : public QFrame
{
    Q_OBJECT

public:
    explicit gauge(QWidget *parent = 0);
    ~gauge();
    void setValues(int req, int Limit, bool extra=false);

private:

    void drawDial();

protected:
    void paintEvent(QPaintEvent *e);

};

“myclass.cpp”

void gauge::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e);


     drawDial();
    return;
}


void gauge::drawDial()
{


    QPainter Needle(this);
    Needle.save();
    Needle.setRenderHint(Needle.Antialiasing, true); // Needle was Staggered looking, This will make it smooth
    Needle.translate(centrePt); // Center of Widget
    Needle.drawEllipse(QPoint(0,0),10,10);
    Needle.restore();
    Needle.end();
}

【问题讨论】:

  • 您是用同样的方法绘制标签,还是在其他地方绘制标签?可以展示一下相关的部分吗?
  • 您是在绘制标签还是将它们 QLabels 添加到布局中?
  • @Mat QLabel 在启动时使用新的 QLabel(this) 创建。它们只被创建一次,并且再也不会被触及(类似于使用 Designer 在 Ui 上手动添加它们)。 drawpolygon() 在 QFrame 的 Paint 事件中。

标签: c++ qt


【解决方案1】:

如果仪表小部件和 QLabel 是同级的,那么您可以通过调用其 raise() 方法将仪表小部件移到前面。

另一方面,如果 QLabels 是仪表小部件的子级,那么它们将始终显示在它的前面。在这种情况下,您可以重新组织您的小部件层次结构,以便它们成为兄弟姐妹,或者您可以摆脱 QLabels 并简单地从您的 paintEvent() 方法调用 drawText() (在 drawDial() 返回之后)

【讨论】:

  • raise() 方法不起作用,我旋转针头,如果不旋转那我怎么做文本?
  • 在 save()/restore() 对之外绘制文本,或者在绘制文本之前旋转回来
  • 谢谢,我会试试的,但听起来计算成本很高,这将在嵌入式系统上进行。如果我将 QLabel 子类化,并在我的新 QLabel 中调用 drawDial() 方法,针还会在标签后面吗?
  • 如果您的 QLabel 子类的 paintEvent() 先调用 QLabel::paintEvent(),然后再绘制表盘,那么表盘将被绘制在文本上。 (如果您担心效率,您可以将渲染的文本缓存到 QPixmap 中,然后在必要时绘制 QPixmap ......但我不会担心这种优化,除非/直到您观察到性能问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2017-08-03
相关资源
最近更新 更多