折腾了两个小时,太久没用了,找了半天的感觉。
先是在视频播放 的代码基础上加选择视频的按钮,开始总是显示两个框,后来发现需要用QSplitter来实现同时有多个框的情况。
把中心窗口设为这个splitter就可以了:setCentralWidget(splitter); 注意,这里不能用layout.
再然后是槽, 我直接写slots: 就报错, 写 private slots:就是对的。 注意槽函数一定要声明在slots里。
文件选择用QFileDialog::getOpenFileName();
每个控件都是在类里面先声明一个相应的指针,然后在函数中具体分配设置。信号与槽的连接也是在构造函数中的。
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow() { playlist = new QMediaPlaylist; player = new QMediaPlayer; videoWidget = new QVideoWidget; chooseVideoButton = new QPushButton(tr("Choose Video")); QSplitter * splitter = new QSplitter; splitter->addWidget(videoWidget); splitter->addWidget(chooseVideoButton); setCentralWidget(splitter); connect(chooseVideoButton, SIGNAL(clicked()), this, SLOT(getVideoName())); videoWidget->show(); } void MainWindow::getVideoName() { fileName = QFileDialog::getOpenFileName(this, tr("Open Video"), "E:", tr("Video Files (*.avi)")); playlist->addMedia(QUrl::fromLocalFile(fileName)); playlist->setCurrentIndex(1); player->setPlaylist(playlist); player->setVideoOutput(videoWidget); player->play(); } MainWindow::~MainWindow() { }
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMediaPlayer> #include <QMediaPlaylist> #include <QVideoWidget> #include <QUrl> #include <QPushButton> #include <QFileDialog> #include <QLayout> #include <QSplitter> class MainWindow : public QMainWindow { Q_OBJECT private slots: void getVideoName(); public: QMediaPlaylist * playlist; QMediaPlayer * player; QVideoWidget * videoWidget; QString fileName; QPushButton * chooseVideoButton; MainWindow(); ~MainWindow(); }; #endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }