Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将QDialog设置为外国人_C++_Qt - Fatal编程技术网

C++ 将QDialog设置为外国人

C++ 将QDialog设置为外国人,c++,qt,C++,Qt,在没有windowmanager或复合管理器的独立GUI应用程序中,我希望向用户显示QDialog以请求值 对话框非常大,所以我想使其半透明,以便用户可以在显示对话框时查看应用程序中发生的情况 问题是,对于X原生窗口的半透明性,需要一个复合管理器。Qt内部小部件可以被绘制成半透明的,因为它们不对应于本机X窗口(外星人),并且完全只有Qt知道 有没有一种方法可以在不运行复合管理器的情况下使QDialog的背景半透明?也许让它成为应用程序主窗口的普通子窗口小部件/外来程序?有更好的替代方法吗?我不知

在没有windowmanager或复合管理器的独立GUI应用程序中,我希望向用户显示QDialog以请求值

对话框非常大,所以我想使其半透明,以便用户可以在显示对话框时查看应用程序中发生的情况

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


有没有一种方法可以在不运行复合管理器的情况下使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来访问下面的小部件。例如,可以通过切换“普通”小部件容器上的
    enabled
    属性来解决此问题。(但不要禁用PopupWidget的父级:这会禁用弹出窗口小部件本身。)
  • 这不允许像
    QDialog::exec这样的阻塞调用
  • 弹出窗口中的小部件不是透明的,您必须为所有需要AFAIK的小部件类型创建自定义的透明背景版本

但这可能比在您的环境中集成合成管理器更麻烦。

我相信您已经看到了“在X11下,您需要运行一个合成管理器,并且X11特定的\u NET\u WM\u WINDOW\u OPACITY atom需要您正在使用的窗口管理器支持。”这是Scully和Mulder的情况!撇开技术问题不谈,这听起来像是一个不同寻常的UI决策。我本人对应用程序自行决定使用这种半透明表示怀疑(而不是在窗口管理器中根据用户偏好使用每个应用程序)。如果你描述了你正在尝试做的事情,并在@敌对我很抱歉我不能,分享了图表/截图,也许你可以得到一些关于替代界面的有用建议。但是谢谢你的邀请UX@SE链接根据平台的选择或要求,您是否没有窗口管理器或复合管理器?