Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个透明的非模态对话框,其中包含一个包含在主应用程序窗口中的Qt框架,并且可以包含QPushButtons按钮_Qt_Widget - Fatal编程技术网

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

如何创建一个透明的非模态对话框,其中包含一个包含在主应用程序窗口中的Qt框架,并且可以包含QPushButtons按钮,qt,widget,Qt,Widget,我想创建一个固定大小的浮动透明对话框,可以移动、最小化和关闭,其中可以包含QLabel和QPushButtons,并包含在主窗口中。我曾尝试使用QDockWidget作为QTableWidget的容器,但我无法使其透明,只是变为黑色。我还尝试使用QWidget和QMdiArea,但背景不透明。我对Qt相当陌生,尤其是Ui方面。这是一个无形的C++应用程序,我试图添加这个UI元素。非常感谢您对如何进行的任何指导。您可以将QDockWidget与QDialog一起使用(或者只使用QWidget就可以

我想创建一个固定大小的浮动透明对话框,可以移动、最小化和关闭,其中可以包含QLabel和QPushButtons,并包含在主窗口中。我曾尝试使用QDockWidget作为QTableWidget的容器,但我无法使其透明,只是变为黑色。我还尝试使用QWidget和QMdiArea,但背景不透明。我对Qt相当陌生,尤其是Ui方面。这是一个无形的C++应用程序,我试图添加这个UI元素。非常感谢您对如何进行的任何指导。

您可以将
QDockWidget
QDialog
一起使用(或者只使用
QWidget
就可以了)。可使用
QGraphicsOpacityEffect
(当驳接未浮动时)或
setWindowOpacity()
(驳接浮动时)设置透明度。示例如下所示:

主窗口

#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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
主窗口(QWidget*parent=nullptr);
~main窗口();
void setDockCapacity();
私人:
QDockWidget dock_widget_u;
QSlider滑块;
};
#endif//main窗口
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, 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);
    }
}
#包括“mainwindow.h”
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
{
此->设置样式表(“QMainWindow”
"{"
“背景色:粉红色;”
"}");
QDialog*dialog=新建QDialog(此对话框);
对话框->设置样式表(“QDialog”
"{"
“边框:2倍纯红;”
“背景色:绿色;”
"}");
QGraphicsPacityEffect*effect=新的QGraphicsPacityEffect(对话框);
效果->设置不透明度(1);
dock_widget_u.setGraphicsEffect(效果);
滑块设置方向(Qt::水平);
滑块设置最小值(10);
滑块设置最大值(100);
滑块设置值(100);
连接(&slider、&QSlider::valueChanged、this和主窗口::setDockCapacity);
连接(&dock_widget_,&QDockWidget::topLevelChanged,this,&MainWindow::SetDockCapacity);
QVBoxLayout*dialog_layout=新建QVBoxLayout{dialog};
对话框布局->设置内容边缘(10,10,10,10);
对话框布局->添加小部件(&滑块);
dock_widget_u.setWidget(对话框);
对话框->设置可见(真);
QWidget*widget=新的QWidget{this};
小部件->设置样式表(“边框:2px纯蓝色;”);
QVBoxLayout*布局=新的QVBoxLayout{widget};
布局->设置内容边缘(50,50,50,50);
此->setCentralWidget(小部件);
这->addDockWidget(Qt::TopDockWidgetArea和dock\u小部件);
这->调整大小(500500);
}
MainWindow::~MainWindow()
{
}
void主窗口::setDockCapacity()
{
if(dock_widget_u.isFloating())
{
dock_widget_u.setWindowOpacity(slider_u.value()/100.0);
qobject_cast(dock_widget_u.graphicsEffect())->setOpacity(1);
}
其他的
{
dock_widget_u.setWindowOpacity(1);
qobject_cast(dock_widget_u.graphicsEffect())->setOpacity(slider_u.value()/100.0);
}
}

您可以将
QDockWidget
QDialog
一起使用(或者只使用
QWidget
就可以了)。可使用
QGraphicsOpacityEffect
(当驳接未浮动时)或
setWindowOpacity()
(驳接浮动时)设置透明度。示例如下所示:

主窗口

#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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
主窗口(QWidget*parent=nullptr);
~main窗口();
void setDockCapacity();
私人:
QDockWidget dock_widget_u;
QSlider滑块;
};
#endif//main窗口
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, 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);
    }
}
#包括“mainwindow.h”
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
{
此->设置样式表(“QMainWindow”
"{"
“背景色:粉红色;”
"}");
QDialog*dialog=新建QDialog(此对话框);
对话框->设置样式表(“QDialog”
"{"
“边框:2倍纯红;”
“背景色:绿色;”
"}");
QGraphicsPacityEffect*effect=新的QGraphicsPacityEffect(对话框);
效果->设置不透明度(1);
dock_widget_u.setGraphicsEffect(效果);
滑块设置方向(Qt::水平);
滑块设置最小值(10);
滑块设置最大值(100);
滑块设置值(100);
连接(&slider、&QSlider::valueChanged、this和主窗口::setDockCapacity);
连接(&dock_widget_,&QDockWidget::topLevelChanged,this,&MainWindow::SetDockCapacity);
QVBoxLayout*dialog_layout=新建QVBoxLayout{dialog};
对话框布局->设置内容边缘(10,10,10,10);
对话框布局->添加小部件(&滑块);
dock_widget_u.setWidget(对话框);
对话框->设置可见(真);
QWidget*widget=新的QWidget{this};
小部件->设置样式表(“边框:2px纯蓝色;”);
QVBoxLayout*布局=新的QVBoxLayout{widget};
布局->设置内容边缘(50,50,50,50);
此->setCentralWidget(小部件);
这->addDockWidget(Qt::TopDockWidgetArea和dock\u小部件);
这->调整大小(500500);
}
MainWindow::~MainWindow()
{
}
void主窗口::setDockCapacity()
{
if(dock_widget_u.isFloating())
{
dock_widget_u.setWindowOpacity(slider_u.value()/100.0);
qobject_cast(dock_widget_u.graphicsEffect())->setOpacity(1);
}
其他的
{
dock_widget_u.setWindowOpacity(1);
qobject_cast(dock_widget_u.graphicsEffect())->setOpacity(slider_u.value()/100.0);
}
}

谢谢,但是对话框下方的屏幕不是v