Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: dmig2006 от Март 14, 2016, 14:08



Название: QPixmap and QPaint и QMediaPlayer
Отправлено: dmig2006 от Март 14, 2016, 14:08
Помогите пожалуйста со следующим вопросом, есть два виджета MainWindow и Test. Надо вывести видео формата h264 а поверх видео еще нарисовать нужную картинку. Видео постоянно идет и все работает
а вот с прорисовкой проблеммы

test.h

Код
C++ (Qt)
#ifndef TEST_H
#define TEST_H
 
#include <QWidget>
#include <QPainter>
#include <QPicture>
#include <QVideoWidget>
#include <QImage>
 
namespace Ui {
   class Test;
}
 
struct Graphics {
   QImage pixmapLogo;
};
 
class Test : public QVideoWidget
{
   Q_OBJECT
 
   Ui::Test *ui;
   QPixmap          mPixmap;
   QImage           pixmapL;
   Graphics          mGraphics;
 
protected:
   void paintEvent(QPaintEvent *);
 
public:
   Test(QWidget *parent = 0);
   ~Test();
};
 
#endif // TESTWIDGET_H
 

test.cpp

Код
C++ (Qt)
#include "test.h"
#include "ui_test.h"
 
Test::Test(QWidget *parent) :
   QVideoWidget(parent), ui(new Ui::Test)
{
   ui->setupUi(this);
 
   QPixmap p("://logo.png");
   QLabel *label = new QLabel(parent);
   label -> resize(150,34);
   label -> setPixmap(p);
   label -> move(610,14);
}
 
Test::~Test()
{
   delete ui;
}

mainwindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QDataStream>
#include "test.h"
 
namespace Ui {
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
   Test *pTest;
   QMediaPlayer *player;
 
#endif // MAINWINDOW_H

mainwindow.cpp

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"  
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   player = new QMediaPlayer(this);//, QMediaPlayer::StreamPlayback);
   pTest = new Test(this);
   pTest -> setGeometry(5,35,1385,1040);
   pTest -> setOptWidget(mOptWidget);
   pTest -> hide();
   player -> setVideoOutput(pTest);
}

В этом случае  картинка выводится поверх стрима плеера.

Если test.cpp написать следующим образом:

test.cpp
Код
C++ (Qt)
#include "test.h"
#include "ui_test.h"
 
Test::Test(QWidget *parent) :
   QVideoWidget(parent), ui(new Ui::Test)
{
   ui->setupUi(this);
   mGraphicsBlack.pixmapLogo.load(":/logo.png");
   mGraphics = mGraphicsBlack;
   pixmapL = mGraphics.pixmapLogo;
}
 
Test::~Test()
{
   delete ui;
}
 
void Test::paintEvent(QPaintEvent *event)
{
   QVideoWidget::paintEvent(event);
   QPainter painter(this);
   painter.drawImage(1010, 14, pixmapL);
   painter.end();
}

То картинка не выводится поверх стрима. Как сделать чтобы именно с QPaint, картинка выводилось поверх стрима, и почему QPixmap выводит поверх а QPaint этого не делает?
Если в mainwindow.cpp мы уберем следующую строчку     
Код
C++ (Qt)
player -> setVideoOutput(pTest);
то картинка будет выводится, я понимаю, что данная функция накладывается поверх QImage при рисовке через QPaint, но QPixmap рисует ее, помогите с этим разобраться что упускаю?