Виджет не отображается должным образом

В этом коде, который может воспроизводить видео и воспроизводить *.mp3. код работает правильно, в моем mainwindow.ui я добавил виджет с именем widgetGif путем перетаскивания. Этот виджет также содержит метку. но этот виджет не виден при запуске программы. Как я могу отобразить этот виджет под названием widgetGif

вот часть моего кода:

#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";

    }
}

person Gamma    schedule 20.12.2017    source источник
comment
QMainWindow нужен centralWidget. Вы должны использовать макеты, чтобы включить QVideoWidget, а также widgetGif, а затем установить его как centralWidget из QMainWindow.   -  person Tarod    schedule 20.12.2017
comment
@Tarod Спасибо, не могли бы вы дать мне образец кода? Пожалуйста.   -  person Gamma    schedule 20.12.2017
comment
Конечно. Позвольте мне написать пример.   -  person Tarod    schedule 20.12.2017


Ответы (1)


QMainWindow нужен centralWidget. Вы должны использовать макеты, чтобы включить QVideoWidget, а также widgetGif, а затем установить его как centralWidget из QMainWindow.

В следующем примере textEdit будет вашим QVideoWidget, а объект label подобен вашему widgetGif.

У нас также есть две кнопки, чтобы скрыть или показать label с помощью метода 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);
}
person Tarod    schedule 20.12.2017
comment
Спасибо большое - person Gamma; 20.12.2017
comment
У меня есть еще один простой вопрос, сэр. в моем коде я устанавливаю фиксированный размер для основного окна, если я открываю .mp3. так . if(filename.endsWith(".mp3")){ this->setFixedSize(500,400);} теперь мне нужно снова настроить главное окно для изменения размера, если я открою другой формат. - person Gamma; 20.12.2017
comment
Информация @Learner здесь. - person Tarod; 20.12.2017