Установка QDialog, чтобы быть иностранцем - PullRequest
5 голосов
/ 06 сентября 2011

В автономном приложении с графическим интерфейсом, где у меня нет оконного менеджера или составного менеджера, я хочу показать QDialog пользователю, чтобы он запросил значения.

Диалог довольно большой, поэтому я хочу сделать его полупрозрачным, чтобы пользователь мог просматривать его, чтобы увидеть, что происходит в приложении, пока отображается диалоговое окно.

Проблема в том, чтодля прозрачности родных окон X должен быть составной менеджер.Внутренние виджеты Qt могут быть нарисованы полупрозрачными, потому что они не соответствуют родным окнам X (инопланетянам) и полностью известны только Qt.

Есть ли способ сделать фон QDialog полупрозрачным без составногоменеджер работает?Возможно, сделать его обычным дочерним виджетом / инопланетянином из главного окна приложения?Есть ли лучшая альтернатива этому?

1 Ответ

2 голосов
/ 07 сентября 2011

Я не знаю ни одного способа превратить QDialog в обычный дочерний виджет.Глядя на код Qt для X11, я не могу найти способ не устанавливать Qt::WindowFlags, переданный конструктору QWidget (parent), чтобы он был простым виджетом, а не собственным окном (ноЯ могу ошибаться, не тратя на это много времени.

Простая альтернатива - использовать простой 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
  • , когда виджеты в этом всплывающем окне выигралиЧтобы быть прозрачным, вам нужно было бы создавать собственные версии с прозрачным фоном для всех типов виджетов, которые вам нужны AFAIK.

Но это, вероятно, не такая сложная задача, как интеграция менеджера композитинга в вашей среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...