gpt4 book ai didi

c++ - 将 QDialog 设置为外星人

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:44 25 4
gpt4 key购买 nike

在我没有窗口管理器或复合管理器的独立 GUI 应用程序中,我想向用户显示 QDialog 以询问值。

这个对话框很大,所以我想把它变成半透明的,这样用户就可以透过它来查看应用程序在显示对话框时发生了什么。

问题是为了 X 原生窗口的半透明,需要有一个复合管理器。 Qt 内部小部件可以涂成半透明,因为它们不对应于 native X 窗口(外星人)并且完全只有 Qt 知道。

有没有办法在不运行复合管理器的情况下使 QDialog 的背景半透明?也许使它成为应用程序主窗口的普通子窗口小部件/外星人?有更好的选择吗?

最佳答案

我不知道有什么方法可以将 QDialog 变成普通的子窗口小部件。查看 Qt for X11 代码,我想不出一种不设置 Qt::WindowFlags 传递给 QWidget (父级)构造函数的方法,这样它就可以是一个普通的小部件而不是它自己的窗口(但我可能是错的,没有花很多时间在这上面)。

一个简单的替代方法是使用普通 QWidget 作为您的容器,而不是 QDialog。这是绘制半透明红色背景的示例“PopupWidget”。

#include <QtGui>

class PopupWidget: public QWidget
{
Q_OBJECT

public:
PopupWidget(QWidget *parent): QWidget(parent)
{
QVBoxLayout *vl = new QVBoxLayout;
QPushButton *pb = new QPushButton("on top!", this);
vl->addWidget(pb);
connect(pb, SIGNAL(clicked()), this, SLOT(hide()));
}

public slots:
void popup() {
setGeometry(0, 0, parentWidget()->width(), parentWidget()->height());
raise();
show();
}

protected:
void paintEvent(QPaintEvent *)
{
QPainter p(this);
QBrush b(QColor(255,0,0,128));
p.fillRect(0, 0, width(), height(), b);
}
};

要显示它,请调用它的 popup() 插槽,这会将它提升到小部件堆栈的顶部,使其与其父级一样大,然后显示它。这将掩盖它后面的所有小部件(您不能用鼠标与它们交互)。当您单击该按钮时,它会自行隐藏。

注意事项:

  • 这不会阻止用户使用 Tab 访问下面的小部件。例如,这可以通过在“普通”小部件容器上切换 enabled 属性来解决。 (但不要禁用 PopupWidget 的父级:那样会禁用弹出窗口小部件本身。)
  • 这不允许像QDialog::exec这样的阻塞调用
  • 弹出窗口中的小部件不会透明,您必须为您需要的所有小部件类型创建自定义透明背景版本 AFAIK。

但这可能比在您的环境中集成一个合成管理器更简单。

关于c++ - 将 QDialog 设置为外星人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7323282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com