如何在Qt中创建一个透明的非模态对话框,该对话框包含在主应用程序窗口中,并且可以包含QPushButtons



我想创建一个固定大小的浮动透明对话框,该对话框可以移动、最小化和关闭,其中可以包含QLabels和QPushButtons,并包含在主窗口中。我曾尝试使用QDockWidget作为QTableWidget的容器,但我无法使其透明,只是变成了黑色。我还试着用一个带有QMdiArea的QWidget,但背景不是透明的。我对Qt相当陌生,尤其是Ui方面。这是一个无格式的C++应用程序,我正试图将这个UI元素添加到其中。任何关于如何继续的指导都将不胜感激。

您可以将QDockWidgetQDialog一起使用(或者只使用QWidget即可(。透明度可以使用QGraphicsOpacityEffect(当停靠未浮动时(或setWindowOpacity()(当停靠浮动时(进行设置。示例如下:

主窗口.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

主窗口.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(&slider_, &QSlider::valueChanged, this, &MainWindow::setDockOpacity);
connect(&dock_widget_, &QDockWidget::topLevelChanged, this, &MainWindow::setDockOpacity);
QVBoxLayout *dialog_layout = new QVBoxLayout{dialog};
dialog_layout->setContentsMargins(10, 10, 10, 10);
dialog_layout->addWidget(&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, &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);
}
}

最新更新