Russian Qt Forum

Qt => Мультимедиа => Тема начата: SL от Май 16, 2010, 19:27



Название: Нарисовать поверх видео
Отправлено: SL от Май 16, 2010, 19:27
Здравствуйте такой вопрос, нужно нарисовать по верх видео текст и небольшую графику (линии) пробовал сделать так:

Код:
class MainWigdet : public QWidget
{
....................................
   QWidget* playerWidget_; // виджет для mplayer
    DrawWidget* renderWidget_;
    QProcess *mplayerProcess_;
}
MainWigdet::MainWigdet(QWidget *parent):QWidget(parent)

{
    playerWidget_ = new QWidget(this);
    playerWidget_->setAttribute(Qt::WA_PaintOnScreen);
 

    renderWidget_ = new DrawWidget(this);
    mplayerProcess_ = new QProcess(this);

    QStringList args;

    args << "-wid" << QString::number(playerWidget_->winId());
    args << movieFile;
    mplayerProcess_->setProcessChannelMode(QProcess::MergedChannels);
    mplayerProcess_->start(mplayerPath, args);

    playerWidget_->resize(800, 500);
    renderWidget_->resize(500, 100);
    renderWidget_->move(200, 200);
 

Пока просто решил сделать в лоб создаю два виджета, предполагаю что    renderWidget, рисуется вторым, собственно так и происходит, но ни как не могу добиться что бы был прозрачный фон и почему то в renderWidget не вызывается событие painEvent 

Код:
class DrawWidget : public QWidget
{
public:
    DrawWidget(QWidget *parent =0);
protected:
     void  painEvent(QPaintEvent *event);
};

void  DrawWidget::painEvent(QPaintEvent *event)
{
     QPainter painter(this);
     QPen Pen(QColor(255,0,0, 255));
     painter.setPen(Pen);
     painter.drawText(50,50,"Test");
.......................................................

если же использовать фильтр то все рисуеться :
Код:
bool DrawWidget::eventFilter(QObject *obj, QEvent *event)
{
    if( (event->type() == QEvent::Paint) && (obj == this) )
    {
        removeEventFilter(this);
        QApplication::sendEvent(obj, event);
        installEventFilter(this);

        QPainter painter(qobject_cast<QWidget*>(obj));
...............................................................................

Попробовал обойтись одним виджетом, то есть рисовать в том в который рисует mplayer
Код:
bool PlayerWidget::eventFilter(QObject *obj, QEvent *event)
{
    if( (event->type() == QEvent::Paint) && (obj == this) )
    {

        setAutoFillBackground(false);
        removeEventFilter(this);
        QApplication::sendEvent(obj, event);
        installEventFilter(this);
        setAutoFillBackground(true);
        QPainter painter(qobject_cast<QWidget*>(obj));
................................................................................

Тогда просто все моргает и не показывается видео.
Платформа Linux