在我没有windowmanager或复合管理器的独立GUI应用程序中,我想向用户显示QDialog以询问值。
对话框非常大,所以我想让它变得半透明,以便用户可以查看它,看看在显示对话框时应用程序中发生了什么。
问题在于,对于X本机窗口的半透明,需要有一个复合管理器。 Qt内部小部件可以涂成半透明的,因为它们不对应于本机X窗口(外星人),并且完全只知道Qt。
有没有办法在没有复合管理器运行的情况下使QDialog半透明的背景?也许使它成为应用程序主窗口的普通子窗口小部件/外星人?有更好的替代方案吗?
答案 0 :(得分:2)
我不知道将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()
插槽,将其提升到小工具堆栈的顶部,使其与其父级一样大,然后显示它。这将掩盖其背后的所有小部件(您无法使用鼠标与它们进行交互)。当您单击该按钮时,它会隐藏起来。
注意事项:
enabled
属性来解决。小部件容器例如。 (但是不要禁用PopupWidget的父级:这会禁用弹出小部件本身。)QDialog::exec
但这可能不如在你的环境中整合合成经理那么简单。