在我没有windowmanager或复合管理器的独立GUI应用程序中,我想向用户显示QDialog以询问值.
对话框非常大,所以我想让它变得半透明,以便用户可以查看它,看看在显示对话框时应用程序中发生了什么.
问题是,对于X本机窗口的半透明,需要有一个复合管理器.Qt内部小部件可以涂成半透明的,因为它们不对应于本机X窗口(外星人),并且完全只有Qt知道.
有没有办法让QDialog半透明的背景没有运行复合管理器?也许使它成为应用程序主窗口的普通子窗口小部件/外星人?有更好的替代方案吗?
我不知道有什么方法可以将 a 变成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);
}
};
Run Code Online (Sandbox Code Playgroud)
要显示它,请调用它的popup()插槽,这会将其提升到小部件堆栈的顶部,使其与其父级一样大,然后显示它。这将掩盖其后面的所有小部件(您无法使用鼠标与它们交互)。当您单击该按钮时,它会自行隐藏。
注意事项:
enabled例如,可以通过切换“普通”小部件容器上的属性来修复此问题。(但不要禁用 PopupWidget 的父级:这会禁用弹出窗口小部件本身。)QDialog::exec但这可能比在您的环境中集成合成管理器更麻烦。
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |