将QDialog设置为外星人

时间:2011-09-06 16:41:00

标签: c++ qt

在我没有windowmanager或复合管理器的独立GUI应用程序中,我想向用户显示QDialog以询问值。

对话框非常大,所以我想让它变得半透明,以便用户可以查看它,看看在显示对话框时应用程序中发生了什么。

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

有没有办法在没有复合管理器运行的情况下使QDialog半透明的背景?也许使它成为应用程序主窗口的普通子窗口小部件/外星人?有更好的替代方案吗?

1 个答案:

答案 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()插槽,将其提升到小工具堆栈的顶部,使其与其父级一样大,然后显示它。这将掩盖其背后的所有小部件(您无法使用鼠标与它们进行交互)。当您单击该按钮时,它会隐藏起来。

注意事项:

  • 这并不妨碍用户使用 Tab 来访问下面的小部件。这可以通过切换正常&#34;正常&#34;上的enabled属性来解决。小部件容器例如。 (但是不要禁用PopupWidget的父级:这会禁用弹出小部件本身。)
  • 这不允许像QDialog::exec
  • 这样的阻止调用
  • 该弹出窗口中的小部件不会透明,您必须为所需的AFAIK所有小部件类型创建自定义透明背景版本。

但这可能不如在你的环境中整合合成经理那么简单。