Я не знаю ни одного способа превратить 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.
Но это, вероятно, не такая сложная задача, как интеграция менеджера композитинга в вашей среде.