从子小部件中删除 QGraphicsEffect [重复]

Posted

技术标签:

【中文标题】从子小部件中删除 QGraphicsEffect [重复]【英文标题】:Remove QGraphicsEffect from child widget [duplicate] 【发布时间】:2016-03-11 07:14:27 【问题描述】:

我正在使用 QGraphics 框架制作游戏。

当游戏结束时,我想模糊整个图形视图并显示一个顶部带有一些文本的小部件。

我的简化代码是:

在视图中:

void GraphicsTraxView::showGameResultWidget(bool res)

    blurEffect_->setEnabled(true);
    WigglyWidget *wigglyWidget = new WigglyWidget(this);
    if(res)
      wigglyWidget->setText("you win");
    else 
      wigglyWidget->setText("you loose");

    wigglyWidget->resize(150,150);
    wigglyWidget->move(QPoint(
        getScreenSize().width() / 2 -75, getScreenSize().height() / 2-75));
    wigglyWidget->show();

在文本小部件中:

void WigglyWidget::paintEvent(QPaintEvent * /* event */)

    QColor backgroundColor = palette().light().color();
    backgroundColor.setAlpha(220);
    QPainter customPainter(this);
    customPainter.fillRect(rect(), backgroundColor);
   //...

但是正如您在下面的图片中看到的,文字也变得模糊且无法阅读。

如何从子小部件中删除 graphicsEffect 并仍然保持小部件的背景颜色半透明?

【问题讨论】:

必须是子部件吗?为什么不能使用WigglyWidget *wigglyWidget = new WigglyWidget;?只需确保销毁小部件即可。 @thuga 有 3 个原因: 1_ 如果它不是子小部件,那么让它半透明是行不通的! 2_显示它使一部分视图不模糊 3_单击视图小部件将其隐藏 @thuga 查看结果:i.stack.imgur.com/wQL3O.png you loose 显示后会发生什么?顺便说一句,应该是你输了:) @thuga "you lost text" 正在以罪恶的形式制作动画,这还没有完成。我必须添加一个按钮并为文字或星星评分...。然后点击按钮返回主菜单或重新开始游戏 【参考方案1】:

您可以将您的WigglyWidget 嵌入到对话框中,或者使自己成为一个对话框。

然后您可以通过使用setWindowOpacity 设置窗口不透明度来使其透明。

如果您将WigglyWidget 嵌入到对话框中,则必须将Qt::WA_TranslucentBackground 属性设置为对话框以使背景透明。

然后您必须为其设置Qt::FramelessWindowHint | Qt::Dialog 标志以摆脱标题栏。

这是一个例子:

QDialog *pop_up = new QDialog(this);
pop_up->resize(200, 200);
pop_up->setAttribute(Qt::WA_TranslucentBackground); 
pop_up->setWindowOpacity(0.5);
pop_up->setStyleSheet("QDialogbackground-color: transparent;");
pop_up->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
pop_up->setLayout(new QVBoxLayout);

QLabel *transparentLabel = new QLabel("TRANSPARENT");
transparentLabel->setAlignment(Qt::AlignCenter);
transparentLabel->setStyleSheet("QLabelcolor: red; font: 20pt bold; background-color: #00baff;");
pop_up->layout()->addWidget(transparentLabel);
pop_up->show();

【讨论】:

以上是关于从子小部件中删除 QGraphicsEffect [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中将 QGraphicsEffect 添加到 QAbstractItemView?

如何在 Qt 中创建一个基本的自定义 QGraphicsEffect?

如何最好地从子小部件访问嵌套小部件的 BuildContext?

如何在 Qt 中将消息从子窗口小部件发送到父窗口?

Flutter:从子 StreamBuilder 更新有状态小部件

Flutter:在 Navigation.pop 上刷新父小部件