问题描述
我想创建一个固定大小的浮动透明对话框,该对话框可以移动,最小化和关闭,可以包含QLabel和QPushButtons并包含在主窗口中。我尝试使用QDockWidget作为QTableWidget的容器,但我无法使其透明,只是变成了黑色。我也尝试过将QWidget与qmdiarea结合使用,但是背景不是透明的。我对Qt相当陌生,尤其是Ui方面。这是我试图添加此UI元素的无格式C ++应用程序。任何有关如何进行的指示都将受到赞赏。
解决方法
您可以将QDockWidget
与QDialog
一起使用(也可以只使用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(&slider_,&QSlider::valueChanged,this,&MainWindow::setDockOpacity);
connect(&dock_widget_,&QDockWidget::topLevelChanged,&MainWindow::setDockOpacity);
QVBoxLayout *dialog_layout = new QVBoxLayout{dialog};
dialog_layout->setContentsMargins(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);
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);
}
}