Как мне создать прозрачный немодальный диалог с фреймом в Qt, который содержится в главном окне приложения и может содержать QPushButtons

#qt #widget

#qt #виджет

Вопрос:

Я хотел бы создать плавающий прозрачный диалог фиксированного размера, который можно перемещать, сворачивать и закрывать, который может содержать QLabels и QPushButtons и содержится в главном окне. Я пытался использовать QDockWidget в качестве контейнера для QTableWidget, но я не смог сделать его прозрачным, просто стал черным. Я также пытался использовать QWidget с QMdiArea, но фон не прозрачный. Я довольно новичок в Qt, особенно в аспектах пользовательского интерфейса. Это бесформенное приложение на C , в которое я пытаюсь добавить этот элемент пользовательского интерфейса. Любые указания о том, как действовать, приветствуются.

Ответ №1:

Вы можете использовать QDockWidget вместе с a QDialog (или просто a QWidget — это нормально). Прозрачность можно установить с помощью QGraphicsOpacityEffect (когда док-станция не плавающая) или setWindowOpacity() (когда док-станция плавающая). Пример показан ниже:

mainwindow.h

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDockWidget>
#include <QSlider>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void setDockOpacity();

private:
    QDockWidget dock_widget_;
    QSlider slider_;
};
#endif // MAINWINDOW_H
  

mainwindow.cpp

 #include "mainwindow.h"

#include <QDialog>
#include <QVBoxLayout>

#include <QGraphicsOpacityEffect>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setStyleSheet("QMainWindow"
                        "{"
                        "   background-color: pink;"
                        "}");

    QDialog *dialog = new QDialog(this);
    dialog->setStyleSheet("QDialog"
                          "{"
                          "    border: 2px solid red;"
                          "    background-color: green;"
                          "}");

    QGraphicsOpacityEffect *effect = new QGraphicsOpacityEffect(dialog);
    effect->setOpacity(1);
    dock_widget_.setGraphicsEffect(effect);

    slider_.setOrientation(Qt::Horizontal);
    slider_.setMinimum(10);
    slider_.setMaximum(100);
    slider_.setValue(100);
    connect(amp;slider_, amp;QSlider::valueChanged, this, amp;MainWindow::setDockOpacity);
    connect(amp;dock_widget_, amp;QDockWidget::topLevelChanged, this, amp;MainWindow::setDockOpacity);

    QVBoxLayout *dialog_layout = new QVBoxLayout{dialog};
    dialog_layout->setContentsMargins(10, 10, 10, 10);
    dialog_layout->addWidget(amp;slider_);
    dock_widget_.setWidget(dialog);
    dialog->setVisible(true);

    QWidget *widget = new QWidget{this};
    widget->setStyleSheet("border: 2px solid blue;");
    QVBoxLayout *layout = new QVBoxLayout{widget};
    layout->setContentsMargins(50, 50, 50, 50);
    this->setCentralWidget(widget);

    this->addDockWidget(Qt::TopDockWidgetArea, amp;dock_widget_);
    this->resize(500, 500);
}

MainWindow::~MainWindow()
{
}

void MainWindow::setDockOpacity()
{
    if (dock_widget_.isFloating())
    {
        dock_widget_.setWindowOpacity(slider_.value() / 100.0);
        qobject_cast<QGraphicsOpacityEffect*>(dock_widget_.graphicsEffect())->setOpacity(1);
    }
    else
    {
        dock_widget_.setWindowOpacity(1);
        qobject_cast<QGraphicsOpacityEffect*>(dock_widget_.graphicsEffect())->setOpacity(slider_.value() / 100.0);
    }
}
  

Комментарии:

1. Спасибо, однако экран под диалогом не виден. Можно ли сделать фон прозрачным, чтобы объекты в диалоговом окне отображались?

2. Я отредактировал свой ответ. Когда док-станция плавает, setWindowOpacity() следует использовать.