C++ 将QDialog设置为外国人
在没有windowmanager或复合管理器的独立GUI应用程序中,我希望向用户显示QDialog以请求值 对话框非常大,所以我想使其半透明,以便用户可以在显示对话框时查看应用程序中发生的情况 问题是,对于X原生窗口的半透明性,需要一个复合管理器。Qt内部小部件可以被绘制成半透明的,因为它们不对应于本机X窗口(外星人),并且完全只有Qt知道C++ 将QDialog设置为外国人,c++,qt,C++,Qt,在没有windowmanager或复合管理器的独立GUI应用程序中,我希望向用户显示QDialog以请求值 对话框非常大,所以我想使其半透明,以便用户可以在显示对话框时查看应用程序中发生的情况 问题是,对于X原生窗口的半透明性,需要一个复合管理器。Qt内部小部件可以被绘制成半透明的,因为它们不对应于本机X窗口(外星人),并且完全只有Qt知道 有没有一种方法可以在不运行复合管理器的情况下使QDialog的背景半透明?也许让它成为应用程序主窗口的普通子窗口小部件/外来程序?有更好的替代方法吗?我不知
有没有一种方法可以在不运行复合管理器的情况下使QDialog的背景半透明?也许让它成为应用程序主窗口的普通子窗口小部件/外来程序?有更好的替代方法吗?我不知道有什么方法可以把
QDialog
变成一个普通的子窗口小部件。查看qtforx11代码,我想不出一种方法来不设置传递给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);
}
};
#包括
类popuwidget:publicqwidget
{
Q_对象
公众:
PopupWidget(QWidget*父项):QWidget(父项)
{
QVBoxLayout*vl=新的QVBoxLayout;
QPushButton*pb=新的QPushButton(“在上面!”,这是);
vl->addWidget(pb);
连接(pb,信号(单击()),此,插槽(隐藏());
}
公众时段:
void popup(){
setGeometry(0,0,parentWidget()->width(),parentWidget()->height());
升起();
show();
}
受保护的:
无效paintEvent(QPaintEvent*)
{
油漆工p(本);
QB(QColor(255,0,0128));
p、 fillRect(0,0,width(),height(),b);
}
};
要显示它,请调用它的popup()
slot,它会将它提升到窗口小部件堆栈的顶部,使其与其父窗口一样大,然后显示它。这将屏蔽它背后的所有小部件(你不能用鼠标与它们交互)。当你点击那个按钮时,它会隐藏起来
注意事项:
- 这不会阻止用户使用Tab来访问下面的小部件。例如,可以通过切换“普通”小部件容器上的
属性来解决此问题。(但不要禁用PopupWidget的父级:这会禁用弹出窗口小部件本身。)enabled
- 这不允许像
QDialog::exec这样的阻塞调用
- 弹出窗口中的小部件不是透明的,您必须为所有需要AFAIK的小部件类型创建自定义的透明背景版本
但这可能比在您的环境中集成合成管理器更麻烦。我相信您已经看到了“在X11下,您需要运行一个合成管理器,并且X11特定的\u NET\u WM\u WINDOW\u OPACITY atom需要您正在使用的窗口管理器支持。”这是Scully和Mulder的情况!撇开技术问题不谈,这听起来像是一个不同寻常的UI决策。我本人对应用程序自行决定使用这种半透明表示怀疑(而不是在窗口管理器中根据用户偏好使用每个应用程序)。如果你描述了你正在尝试做的事情,并在@敌对我很抱歉我不能,分享了图表/截图,也许你可以得到一些关于替代界面的有用建议。但是谢谢你的邀请UX@SE链接根据平台的选择或要求,您是否没有窗口管理器或复合管理器?