Search code examples
c++qtqwidgetqmediaplayer

Widget is not properly visible


In this code which can able to play video and play *.mp3. code works properly,in my mainwindow.ui I added widget called widgetGif by drag and drop .This widget containing label also. but this widget not visible when I run the program. How can I display this widget called widgetGif

here is part of my code :

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMovie>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    player = new QMediaPlayer(this);
    vw = new QVideoWidget (this);
    player->setVideoOutput(vw);
    this->setCentralWidget(vw); //I think this is the reason

    slider = new QSlider(this);
    bar = new QProgressBar(this);
    slider->setOrientation(Qt::Horizontal);
    ui->statusBar->addPermanentWidget(slider);
    ui->statusBar->addPermanentWidget(bar);



    connect(player,&QMediaPlayer::durationChanged,slider,&QSlider::setMaximum);
    connect(player,&QMediaPlayer::positionChanged,slider,&QSlider::setValue);
    connect(slider,&QSlider::sliderMoved,player,&QMediaPlayer::setPosition);
    connect(player,&QMediaPlayer::durationChanged,bar,&QProgressBar::setMaximum);
    connect(player,&QMediaPlayer::positionChanged,bar,&QProgressBar::setValue);


    sliderVolumn = new QSlider(this);
    sliderVolumn->setOrientation(Qt::Horizontal);
    ui->statusBar->addPermanentWidget(sliderVolumn);

    connect(sliderVolumn,&QSlider::sliderMoved,player,&QMediaPlayer::setVolume);

    QMovie *movie=new QMovie(":/res/icons/giphy.gif");
    if (!movie->isValid())
    {
        // Something went wrong :(
    }
    ui->labelGif->setMovie(movie);
    movie->start();

    ui->widgetGif->setVisible(true);
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionOpen_triggered()
{
    QString filename= QFileDialog::getOpenFileName(this,"Open Folder","","Open a File(*.*)");
    on_actionStop_triggered();
    player->setMedia(QUrl::fromLocalFile(filename));
    on_actionPlay_triggered();

    if(filename.endsWith(".mp3")){
        qDebug() << " file is mp3";

    }else{
        qDebug() << " not is mp3";

    }
}

Solution

  • QMainWindow needs a centralWidget. You must use layouts to include your QVideoWidget and also your widgetGif and then set it as centralWidget of the QMainWindow.

    In the following example, textEdit would be your QVideoWidget and the object label is like your widgetGif.

    We have also two buttons to hide or show label using the method setVisible.

    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.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class QLabel;
    class QPushButton;
    class QTextEdit;
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
        QWidget *centralWidget;
        QLabel *label;
        QPushButton *pushButton;
        QPushButton *pushButton_2;
        QTextEdit *textEdit;
    
    public slots:
        void showSlot();
        void hideSlot();
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QVBoxLayout>
    #include <QLabel>
    #include <QPushButton>
    #include <QTextEdit>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // Vertical layout
        QVBoxLayout *mainLayout = new QVBoxLayout;
    
        // Widgets
        centralWidget = new QWidget(this);
        label = new QLabel();
        pushButton = new QPushButton();
        pushButton_2 = new QPushButton();
        textEdit = new QTextEdit();
    
        // Title and texts
        this->setWindowTitle("MainWindow");
        label->setText("TextLabel");
        pushButton->setText("Show");
        pushButton_2->setText("Hide");
    
        // Add widgets to layout
        mainLayout->addWidget(textEdit);
        mainLayout->addWidget(label);
        mainLayout->addWidget(pushButton);
        mainLayout->addWidget(pushButton_2);
    
        centralWidget->setLayout(mainLayout);
    
        // Set the central widget
        this->setCentralWidget(centralWidget);
    
        connect(pushButton, SIGNAL (clicked()), this, SLOT (showSlot()));
        connect(pushButton_2, SIGNAL (clicked()), this, SLOT (hideSlot()));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::showSlot()
    {
        label->setVisible(true);
    }
    
    void MainWindow::hideSlot()
    {
        label->setVisible(false);
    }