QT学习笔记(九)—— 实现①从本地选择播放源②连接数据库③带有播放列表的视频播放器

一、前言

1.在QT学习笔记(六)——①进度条可拖动、点击②有暂停按钮 的视频播放器的基础上构建。
2.因为实现的功能有点多,所以讲解的思路和前几篇不太一样了,先不把UI的设计一股脑儿列出来,而是一个功能一个功能的介绍。
3.实现的功能如下
(1)从本地选择播放源
(2)播放列表;选择过的视频文件列入播放列表(数据库)
(3)双击播放列表中的视频,播放

二、从本地选择播放源

1.UI设计

多加了一个PushButton,起名为btnAdd.
在这里插入图片描述

2.mainwindow.h文件中槽函数的声明

private slots:

   void onBtnAddClicked();

3.槽函数的编写、信号机制

//监听按钮,选择播放源
connect(ui->btnAdd,SIGNAL(clicked()),this,SLOT(onBtnAddClicked()));

void MainWindow::onBtnAddClicked()
{
    //QString curPath="F:\\QT project\\res";  //绝对路径
    QString curPath="..\\res";    //相对路径
    QString dlgTitle="选择视频文件"; //对话框标题
    QString filter="mp4文件(*.mp4);;所有文件(*.*)"; //文件过滤器
    QString aFile=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);

    if (aFile.isEmpty())
      return;

    QFileInfo   fileInfo(aFile);
    //ui->LabCurMedia->setText(fileInfo.fileName());

    player->setMedia(QUrl::fromLocalFile(aFile));//设置播放文件
    player->play();
}

4.“构建个锤子”,运行!

如果不先构建的话,编写代码的时候不认识新加的btnAdd这个控件,所以先“构建个锤子”,没问题了再运行

5.效果

在这里插入图片描述
“大家中午好,我是铁矿幼儿nuan小二班的报菜nuan~”

三、连接数据库SQLITE测试工作(真正工作请看“四”)

SQLite是内置的,相当于已经把SQLite加入到DB的环境中了,所以后面我们只需要建立db文件就可以了

1.配置文件修改

在配置文件第一行加入sql三个字母(其实以前加过了)

QT       += coregui sql

2.UI设计

(1)加入一个tableView,用来显示播放列表
(2)创建个锤子

3.连接数据库测试工作

首先,先创建一个db文件看看行不行。在mainwindow的构造函数内加入以下代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   
    /*----------------------数据库--------------------*/
    qDebug()<<QSqlDatabase::drivers();  //打印看看(已经存在的)驱动是什么
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  //说明使用的是SQLLITE这个数据库
    db.setDatabaseName("videoplayer.db");  //创建db文件
    db.open();
    db.exec("create table if not exists playlist(id integer primary key autoincrement, name text, url text)");

    db.close();
  }

运行,然后去看能不能生成db文件。db文件可能生成在两个地方,分别是
(1)和项目源码同一个文件夹
在这里插入图片描述
(2)在这个项目的配置文件夹(build … MinGW_64_bit Debug)中
在这里插入图片描述
创建成功了。然后执行insert、select语句看看能不能成功。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   
    /*----------------------数据库--------------------*/
    qDebug()<<QSqlDatabase::drivers();  //打印看看(已经存在的)驱动是什么
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  //说明使用的是SQLLITE这个数据库
    db.setDatabaseName("videoplayer.db");  //创建db文件
    db.open();
    QSqlQuery query;
    if(!query.exec("create table if not exists playlist(id integer primary key autoincrement, name text, url text)")){
        qDebug()<<"Error 1 (create error)"<<query.lastError().text();
        return;
    }
    if(!query.exec("insert into playlist(name,url) values('test','urltest')")){
        qDebug()<<"Error 2 (insert error)"<<query.lastError().text();
        return;
    }
    if(!query.exec("select * from playlist")){
        qDebug()<<"Error 3 (select error)"<<query.lastError().text();
        return;
    }
    while(!query.next()){
        qDebug()<<query.value(0).toInt()<<query.value(1).toString()<<
                  query.value(2).toString();
    }
    db.close();
  }

如果失败的话会输出规定的语句,程序输出窗口没有这些输出说明成功了,为了保险起见我们用DB Browser for SQLite这个软件可视化一下db文件
在这里插入图片描述
在这里插入图片描述
看insert成功!
在这里插入图片描述

我们希望把数据库里的每一条记录都显示在tableView这个控件上,并且希望只显示它的name字段。
借助一个querymodel,就只需要3行代码!考虑到后面还要用这个model,所以把他写在成员函数里设为全局变量了。

class MainWindow : public QMainWindow
{
private:
    QSqlQueryModel *model;
}

如果这个样子呢,是把整个表弄过来了,虽然很丑,但是我们对于数据库的测试工作已经完成了。

 model = new QSqlQueryModel;
 model->setQuery("select * from playlist");
 ui->tableView->setModel(model);

在这里插入图片描述
为什么说以上工作只是测试工作呢?因为我们要实现的是用户在本地文件选中一个mp4文件后,再把文件名插入数据库中,上面insert的只是瞎编的数据,而且把整个表全放进去tableview了,完全不符合项目要求。

四、连接数据库,设置播放列表

1.双击播放列表某一行,开始播放相应视频

声明槽函数

private slots:
void onItemDBCliked(const QModelIndex &index);

连接双击信号

//监听播放列表的双击
    connect(ui->tableView,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(onItemDBCliked(QModelIndex)));

编写槽函数

/*
 * 双击播放列表,播放相应视频
*/
void MainWindow::onItemDBCliked(const QModelIndex &index){
    qDebug()<<index.row();  //打印用户点击的第几行
    QSqlRecord record = model->record(index.row());  //得到在数据库表中是第几条记录
    //测试,并且URL中的中文能够正常输出
    //qDebug()<<record.value("id").toInt()<<record.value("name").toString()<<record.value(2).toString();
    //播放相应视频,这里应该用绝对路径(否则选择播放源的功能就不能在整个文件管理器进行了)
    player->setMedia(QMediaContent(QUrl::fromLocalFile(record.value(2).toString())));
    player->play();
}

2.从本地选择某个文件后,数据库表中新增一行,播放列表也随着刷新
思路是,改写播放本地视频的函数onBtnAddClicked()。选择一个视频以后,立马像数据库中插入一行记录,同时刷新tableView.
这里遇到一个问题是,我们希望tableView只显示视频的名字,而不是把数据库一行记录的所有字段都显示出来,用到的方法是,再定义一个全局变量model2。

model = new QSqlQueryModel;
    model2 = new QSqlQueryModel;
    model->setQuery("select * from playlist");
    model2->setQuery("select name from playlist");
    ui->tableView->setModel(model2);
/*
 * 点击右下角按钮,选择本地文件
*/
void MainWindow::onBtnAddClicked()
{
    //QString curPath="F:\\QT project\\res";  //绝对路径
    QString curPath=".\\res";    //相对路径
    QString dlgTitle="选择视频文件"; //对话框标题
    QString filter="mp4文件(*.mp4);;所有文件(*.*)"; //文件过滤器
    QString aFile=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);

    if (aFile.isEmpty())
      return;

    QFileInfo   fileInfo(aFile);
    //ui->LabCurMedia->setText(fileInfo.fileName());
    // qDebug()<<aFile;  //是这样“F:/QT project/res/当幼儿园遇上万圣节.mp4”的字符串
    player->setMedia(QUrl::fromLocalFile(aFile)); //用aFile这个绝对路径实现的播放
    player->play();
    /*--------选的哪个就存入数据库(先不考虑重复的问题)------*/
    QSqlQuery query;
    /*----获取视频文件的名字---*/
    int index=-1, lastIndex;
    do{
       lastIndex = index;
       index = aFile.indexOf('/',index+1);
    }while(index!=-1);
    QString name = aFile.right(aFile.length()-lastIndex-1);
    /*---------------------*/
    QString cmd = QString("insert into playlist(name,url) values('%1','%2')").arg(name).arg(aFile);
    if(!query.exec(cmd)){
          qDebug()<<"Error 2 (insert error)"<<query.lastError().text();
          return;
    }
    /*-------刷新播放列表--------*/
    model->setQuery("select * from playlist");
    model2->setQuery("select name from playlist");
    ui->tableView->setModel(model2);
}

问题与思考

  1. 如果有的时候你在ui里改了名字,并且也构建了,cpp文件还是不认识这个控件的话,那就再改一个新名字
  2. 用DB Browser fo Sqlite可视化时,运行期间可能会出现这个错误“database is locked Unable to fetch row”。原因是你在这个软件里手动删除了记录,但是没保存,如果再调用insert语句的话,是一种对文件的“写写互斥”。保存一下就好啦。
  3. 关于中文字符向数据库存储和从数据库取出的问题。定义数据库table的字段时,将那个字段写为text类型,插入的时候不用管;取出的时候要加一个toString()函数。
  4. 错误:QSqlQuery::value: not positioned on a valid record
    因为我把上一段执行select的语句屏蔽了,query里是空的,所以query.next出错了
/*-------查询到的存在query里--------*/
   // if(!query.exec("select * from playlist")){
   //    qDebug()<<"Error 3 (select error)"<<query.lastError().text();
   //     return;
  //  }
    while(!query.next()){
        qDebug()<<query.value(0).toInt()<<query.value(1).toString()<<
                  query.value(2).toString();
    }
  1. 调试程序的时候,如果陷入死循环,点了下面“Stop Running Program”这个小红按钮暂停它以后,如果想要再次编译运行,会提示你.exe 这个程序没有权限打开。
    在这里插入图片描述
    是因为.exe这个程序上次只是终止了,没有被关掉,所以无法再次打开。我们可以WIN10的任务管理器中找到它,停掉这个任务就可以了。
  2. 目前程序存在一个问题,db.close()以后,后面的数据库操作就进行不了(但不会报错),所以db.open()以后,我一直没有关上它。。。
  3. 数据库的操作如果报出“ not positioned on a valid record”说明query这个东西指向的地方不是你认为的地方。比如执行了select以后,结果存放在query中,query指向结果的最后一行的下一行,但是如果你用query.value(0).toInt()这样从query中取结果的话,就要先用一个query.first()或者query.next()函数将指针指向结果集的第一行
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要编译一个视频播放器,首先需要安装Qt 6的开发环境。然后可以按照以下步骤进行操作: 1. 创建一个新的Qt项目,选择桌面应用程序。 2. 在项目中添加Qt Multimedia模块,这个模块包含了视频播放所需的类和函数。 3. 在主窗口中添加一个QMediaPlayer对象,并调用setMedia()函数来设置要播放视频文件路径。 4. 添加一个QVideoWidget对象,这个对象用来显示视频画面。将QVideoWidget对象设置为QMediaPlayer对象的输出设备,可以通过调用setVideoOutput()函数来实现。 5. 添加一些控制按钮,比如播放、暂停、停止、快进、快退等,这些按钮通过调用QMediaPlayer对象的相应函数来实现。 6. 编译并运行程序,测试其播放本地视频的功能。 下面是一个示例代码: ```cpp #include <QtWidgets> #include <QtMultimedia> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout *layout = new QVBoxLayout(&window); QMediaPlayer *player = new QMediaPlayer; QVideoWidget *videoWidget = new QVideoWidget; player->setVideoOutput(videoWidget); QPushButton *playButton = new QPushButton("Play"); QObject::connect(playButton, &QPushButton::clicked, player, &QMediaPlayer::play); QPushButton *pauseButton = new QPushButton("Pause"); QObject::connect(pauseButton, &QPushButton::clicked, player, &QMediaPlayer::pause); QPushButton *stopButton = new QPushButton("Stop"); QObject::connect(stopButton, &QPushButton::clicked, player, &QMediaPlayer::stop); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(playButton); buttonLayout->addWidget(pauseButton); buttonLayout->addWidget(stopButton); layout->addWidget(videoWidget); layout->addLayout(buttonLayout); player->setMedia(QUrl::fromLocalFile("/path/to/video/file.mp4")); window.show(); return app.exec(); } ``` 注意,本示例中需要将"/path/to/video/file.mp4"替换为你要播放视频文件路径。 ### 回答2: 要编译一个能够播放本地视频Qt6视频播放器,可以按照以下的步骤进行操作: 1. 首先,需要在Qt软件包管理器中安装Qt6的开发工具及相关的多媒体模块。 2. 在Qt Creator中创建一个新的Qt Quick应用程序项目。 3. 在Qt Quick应用程序项目中,添加一个视频播放器的主窗口组件,可以使用Qt Quick Controls来简化界面设计。 4. 为视频播放器主窗口添加一个QMediaPlayer对象,用于管理视频播放。 5. 在QMediaPlayer对象中设置视频,可以通过选择本地视频文件的方式或者设置文件路径的方式来指定视频。 6. 在主窗口组件中,添加用于播放控制的按钮,如播放、暂停、停止等。 7. 在按钮的点击事件处理函数中,调用对应的QMediaPlayer函数来实现视频播放控制的功能。 8. 可以根据需要,为视频播放器添加额外的功能,如音量控制、视频进度条、全屏播放等。 9. 运行程序,将会出现视频播放器的界面。可以通过点击按钮来控制视频播放、暂停和停止。 10. 在程序运行中,如果想要切换不同的本地视频文件进行播放,可以添加一个文件选择对话框,让用户能够选择播放视频文件。 以上是一个基本的步骤,当然在实际编码过程中还可能会遇到其他具体的问题,需要根据情况进行调试和解决。编译成功后,就可以使用Qt6编译的视频播放器播放本地视频了。 ### 回答3: 要编译一个基于Qt6的视频播放器播放本地视频,你可以按照以下步骤进行: 步骤1:准备工作 首先,确保你已经安装了Qt6开发环境,并且已经配置好了开发环境的路径。你可以从Qt官方网站下载并安装最新的Qt开发环境。 步骤2:创建Qt项目 打开Qt开发环境,点击"新建项目"按钮,选择"应用程序",然后选择"Qt Widgets 应用"。输入项目名称,选择存储位置,并点击"下一步"。 步骤3:设计播放器界面 在Qt设计器中,你可以设计你的播放器界面。可以添加一个视频播放区域、播放按钮、暂停按钮、停止按钮等控件,并为这些控件添加相应的信号和槽。 步骤4:添加视频播放功能 在Qt编程界面,你可以通过使用Qt提供的Multimedia模块来实现视频播放功能。你可以使用QMediaPlayer类来加载和播放本地视频文件。在槽函数中,你可以使用QMediaPlayer的相应函数来控制视频播放、暂停和停止。 步骤5:编译和运行 完成上述步骤后,你可以点击Qt开发环境中的"运行"按钮来编译和运行你的项目。你应该能够看到你设计的播放器界面,并且能够播放本地视频文件。 总结: 通过上述步骤,你可以使用Qt6来编译一个视频播放器,用于播放本地视频。你需要在Qt开发环境中创建一个新的项目,设计播放器界面,并使用Qt的Multimedia模块来添加视频播放功能。最后,编译和运行你的项目,就可以播放本地视频了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值