#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()
следует использовать.