Qt 已知 将视频播放到窗口C 中时,且一定不可以将半透明窗口D设置为C的子窗口。窗口C 才可正常播放。如果想要 一个无论如何移动或者改变大小C窗口,半透明窗口D都可以悬浮于窗口C,当C被其他窗口遮挡时,D也不会展现。即就好像D是C的子窗口一样,Qt Cpp 源码如何实现?
时间: 2023-07-19 11:03:55 浏览: 89
源码 悬浮窗 悬浮窗口和半透明实现效果.zip
实现这个功能,可以使用Qt的Graphics View Framework。具体步骤如下:
1. 创建一个QGraphicsView对象作为窗口C,设置其背景为黑色(或者其他颜色),并将其设置为透明。
2. 创建一个QGraphicsScene对象,并将其设置为QGraphicsView的场景。
3. 在场景中添加一个QGraphicsPixmapItem对象,用于显示视频。
4. 创建一个QWidget对象作为窗口D,设置其背景为半透明的白色(或者其他颜色),并将其设置为透明。
5. 将QWidget对象添加到场景中,并设置其Z值,使其位于QGraphicsPixmapItem之上。
6. 在QGraphicsView中重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个事件函数,实现窗口C的拖拽和缩放功能。
7. 在QGraphicsPixmapItem中重写boundingRect函数,返回其在场景中的边界矩形,从而使得窗口D可以自动跟随QGraphicsPixmapItem的位置和大小变化。
8. 在QWidget中重写paintEvent函数,绘制窗口D的内容。
下面是示例代码:(假设视频文件为test.mp4)
```
#include <QtWidgets>
#include <QtMultimedia>
class VideoPlayer : public QGraphicsView {
public:
VideoPlayer(QWidget *parent = nullptr) : QGraphicsView(parent) {
setStyleSheet("background-color: black"); // 设置背景为黑色
setWindowFlags(Qt::FramelessWindowHint); // 去掉边框
setAttribute(Qt::WA_TranslucentBackground); // 设置为透明
setDragMode(QGraphicsView::ScrollHandDrag); // 设置拖拽模式
setRenderHint(QPainter::Antialiasing); // 抗锯齿
QGraphicsScene *scene = new QGraphicsScene(this);
QGraphicsPixmapItem *item = new QGraphicsPixmapItem();
item->setPixmap(QPixmap(":/test.mp4")); // 加载视频
scene->addItem(item);
setScene(scene);
QWidget *widget = new QWidget();
widget->setStyleSheet("background-color: rgba(255, 255, 255, 128)"); // 设置半透明白色背景
widget->setAttribute(Qt::WA_TranslucentBackground); // 设置为透明
widget->setFixedSize(200, 100); // 设置固定大小
widget->move(10, 10); // 设置初始位置
widget->installEventFilter(this); // 安装事件过滤器
scene->addWidget(widget);
widget->raise(); // 将窗口D置于顶层
}
protected:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
m_lastPos = event->pos();
setCursor(Qt::ClosedHandCursor);
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
QPoint delta = event->pos() - m_lastPos;
translate(delta.x(), delta.y());
m_lastPos = event->pos();
}
}
void mouseReleaseEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
setCursor(Qt::ArrowCursor);
}
}
QRectF boundingRect() const override {
return sceneRect();
}
bool eventFilter(QObject *obj, QEvent *event) override {
if (event->type() == QEvent::Paint) {
QPainter painter((QWidget*) obj);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.setBrush(QBrush(QColor(255, 0, 0, 128))); // 绘制红色半透明矩形
painter.drawRect(10, 10, 180, 80);
return true;
}
return QGraphicsView::eventFilter(obj, event);
}
private:
QPoint m_lastPos;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
VideoPlayer player;
player.resize(640, 480);
player.show();
return app.exec();
}
```
阅读全文