在 table 后面一层的标签上绘图

Drawing on a label that's a layer behind a table

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

我想在 table 仍然可见但不可用时在标签上绘图。由于标签位于 table 后面的一层,即使我禁用 table 并禁用焦点,我也无法在其上绘制。它仅在标签位于前景时有效,但这意味着 table 不再可见。

我想一按按钮就画:

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

但是这不起作用。 table 被禁用且不可用(这是正确的),但无法在 bg_label 上绘制。

在 Designer 中,bg_label 是 class 'DrawLabel' 的占位符,它继承自 QLabel。在 class 中,绘图成为可能,我可以对各种鼠标事件做出反应。一切正常,理论上我可以画画,但如果 bg_label 是 table 后面的一层。

我知道您可以 raise/lower 小部件的图层

  bg_label->activateWindow();
  bg_label->raise();

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

有什么办法可以实现吗?我在任何地方都没有看到类似的问题。

fg_table 在视觉上是透明的这一事实无关紧要。简单的事实是 fg_table 将接收所有鼠标事件。它不接受的那些将被传播到父级——不一定是看起来在视觉下方的小部件——即 bg_label.

假设前景table不需要与您可能使用的鼠标事件交互...

fg_table->setAttribute(Qt::WA_TransparentForMouseEvents);

应该 导致所有鼠标事件进入 bg_label