我不知道如何将
QDialog
转换为普通子小部件。查看Qt for X11代码,我无法找到一种方法来设置未传递给
QWidget
(父级)构造函数的
Qt :: WindowFlags
,以便它成为一个简单的小部件而不是自己的窗口(但我可能是错的,在此上没有花费太多时间)。
一个简单的替代方案是使用一个普通的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
这样的阻塞调用。
- 该弹出窗口中的小部件将不透明,您需要为所需的所有小部件类型创建自定义透明背景版本。
但这可能比在您的环境中集成合成管理器更方便。