在标签上绘图,这是桌子后面的一层

时间:2017-06-17 14:39:00

标签: c++ qt qpainter qlabel

在我的应用程序中,我在前台有一张表。它有一个透明的背景,所以我可以通过它看到带有图像的标签。表格和标签的大小完全相同。

我希望在表格仍可查看时在标签上绘图,但不可用。由于标签是桌子后面的一层,我就是无法在它上画画,即使我禁用了桌子并禁用焦点。它仅在标签位于前景时才有效,但这意味着该表格不再可见。

我想在按下按钮后立即绘制:

void MainWindow::on_btn_draw_clicked()
{
  fg_table->setFocusPolicy(Qt::NoFocus);
  fg_table->setEnabled(false);
  bg_label->setFocusPolicy(Qt::StrongFocus);
  bg_label->setFocus();
}

然而哪个不起作用。该表已禁用且无法使用(这是正确的),但无法在bg_label上绘图。

在Designer中,bg_label是继承自QLabel的类“DrawLabel”的占位符。在类中,绘图成为可能,我可以对各种鼠标事件做出反应。一切正常,理论上我可以画,但不是bg_label是桌子背后的一层。

我知道您可以使用

升级/降低小部件的图层
  bg_label->activateWindow();
  bg_label->raise();

但这不是我想要的。不应该更改图层,我只想在bg_label上的表格后面绘制。

有没有办法实现这个目标?我没有在任何地方看到类似的问题。

1 个答案:

答案 0 :(得分:1)

fg_table视觉上透明的事实无关紧要。简单的事实是fg_table将接收所有鼠标事件。那些它不接受的东西将被传播给父母 - 不一定是看似在视觉上的小部件 - 即bg_label

假设前台表需要与您可能使用的鼠标事件进行交互...

fg_table->setAttribute(Qt::WA_TransparentForMouseEvents);

应该导致所有鼠标事件转到bg_label