覆盖小部件

Overlay widgets

本文关键字:小部 覆盖      更新时间:2023-10-16

我试图在我的视频播放器上覆盖几个按钮。

我添加了一个名为overlay.cpp的新类,它子类化了QWidget用于覆盖。

我在代码中所做的是将按钮叠加到视频上。在我的centralWidget中,我添加了一个垂直布局,并将其变形为QWidget。视频被添加到这个verticalLayout中。程序运行后,视频播放效果良好。然而,不工作的是按钮的覆盖。背景似乎不透明,即使它是设置。我不确定是什么原因导致它看起来不透明。

我的代码如下:

main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[]){
  QApplication a(argc, argv);
  MainWindow w;
  w.show();
  return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent), 
  ui(new Ui::MainWindow){
  ui->setupUI(this);
  initializeVideo();
  initializeButton();
}
MainWindow::~MainWindow(){
  delete ui;
}
void MainWindow::initializeVideo(){
  QVideoWidget *v_widget = new QVideoWidget;
  QMediaPlayer *m_player = new QMediaPlayer;
  m_player->setMedia(QUrl::fromLocalFile("C:/user/Desktop/video.wmv"));
  m_player->setVideoOutput(v_widget);
  ui->verticalLayout->addWidget(v_widget);
  m_player->player();
  v_widget->show();
}
void MainWindow::initializeButton(){
  QFrame *b_frame = new QFrame;
  QGridLayout *grid = new QGridLayout;
  b_frame->setLayout(grid);
  b_frame->setAttribute(Qt::WA_TranslucentBackground, true);
  QPushButton *buttonStop = new QPushButton;
  buttonStop->setText("STOP");
  grid->addWidget(buttonStop, 0, 0, Qt::AlignTop);
  overlay *overlay_1 = new overlay;
  QGridLayout *gridLayout = new QGridLayout;
  gridLayout->addWidget(b_frame);
  overlay_1->setLayout(gridLayout);
  overlay_1->setParent(ui->verticalWidget);
  overlay_1->show();
  b_frame->show();
}

overlay.cpp

#include "overlay.h"
overlay::overlay(QWidget *parent): QWidget(parent){
  this->setAttribute(Qt::WA_TranslucentBackground, true);
}

QVideoWidget *v_widgetQMediaPlayer *m_player的声明像这样移动到mainwindow.h:

private:
    Ui::MainWindow *ui;
    QVideoWidget *v_widget;
    QMediaPlayer *m_player;

In mainwindow.cpp:

void MainWindow::initializeVideo()
{
    v_widget = new QVideoWidget(this);
    m_player = new QMediaPlayer(this);
    m_player->setMedia(QUrl::fromLocalFile("C:/user/Desktop/video.wmv"));
    m_player->setVideoOutput(v_widget);
    ui->verticalLayout->addWidget(v_widget);
    m_player->play();
}
void MainWindow::initializeButton()
{
    QGridLayout *grid = new QGridLayout(v_widget);
    QPushButton *buttonStop = new QPushButton(this);
    buttonStop->setText("STOP");
    grid->addWidget(buttonStop, 0, 0, Qt::AlignTop);
}

这将在QVideoWidget顶部添加"STOP"按钮。

在创建小部件时指定它的父部件。new QVideoWidget(this)将创建新的QVideoWidget作为当前MainWindow小部件的子部件。如果您正在创建已经可见的小部件的子部件,则不需要调用show()