多个类操作同一个Ui界面的方法(音乐播放器前期总结)

来源:互联网 发布:linux 7种运行级别 编辑:程序博客网 时间:2024/05/16 06:59

最近自己在做类似于QQ音乐的播放器,用Qt模仿它的界面去写的。本地音乐播放功能差不多实现,除了歌词。

现在已实现的功能:(1)本地歌曲播放

                                 (2)播放,暂停,下一首,上一首

                                 (3)从文件夹添加歌曲至本地歌曲列表并显示 

                                  同时添加至数据库,数据库保存歌曲 id,歌曲地址,歌曲名,作者,专辑   

                                 (4)进度条随播放时间移动

                                 (5) 能拖动播放进度条并且显示拖动的位置上歌曲时间

                                 (6)显示总的播放时间以及当前已播放时间
                                 (7)添加歌曲时有歌曲查重功能,重复添加无效
                                 (8)开机应用开启时自动从数据库读取所有本地歌曲信息并显示再在播放列表
                 
                   界面做的比较难看,但作为新手尽力了
随着代码逐渐累积,我在想再一个类内写代码增加了代码的耦合性,也不利于代码的维护和扩展,所以我想能不能把ui界面下不同的区域给不同的类去做,比如播放控制栏,所有的界面,比如本地下载和下载界面之类的,它们的播放控制栏都是一样的,所以只要单独为播放控制栏写一个类就行了,免得每写一个界面都得重写一次。那么就涉及到一个问题,如何多个类控制一个ui界面
经过上午的构思,我写了一个简单的test,发现是可行的。(完全没有参照网上的想法,纯粹自己想的,所以有些想的不周到的地方还请大家不要见笑)

  解释一下想法,mywidge.h内声明了Ui::MyWidget *ui,这个时候ui是什么都没有的,它只是相当于告诉编译器我有这个类型的变量,

至于具体什么类型,内存分配之类到mywidget.cpp再说,至于mywidget.h里它为什么能用这个类型,因为上面namespace已经声明了。

转到mywidget.cpp来,可以看到MyWidget类的构造函数的初始化列表有个ui(new Ui::MyWidget);现在ui就不是空的了,它已经被初始化了,

这个类型具体的定义和内部构造可以打开ui_mywidget.h头文件,里面放了很多关键的东西,比如你放在ui界面下的部件的初始化,

将界面部件信号和转到槽生成的槽函数自动连接等等,不细说。以上都是你生成Qt Application项目就会自动帮你做好的,

下面是具体的如何多个类控制一个ui

   假设mywidget.hmywidget.cpp都是将军,他们高高在上,具体的琐事有小兵去做,而将军要做的就是生成一个个执行他们命令的小兵,

mywidget.cpp里的one *menu = new one(ui);在产生小兵的同时把将军对界面控制权分给他们,他们就也能对界面去做修改了。

当然写博客的时候我也想到一个问题,把整个ui界面的控制权给其他类是否合适?这也就意味着其他类能做超越本身职权的事情,

例如操作播放控制栏的类也可以操作界面其他地方,所以是不是可以只传给它能操作的界面指针进去更合适。

   这是我写音乐播放器前期的一点小感悟,分享出来,不吝赐教。也希望能帮到其他人。

   不积跬步无以致千里,总结项目能帮助我理清思路,直视盲点,获得更多经验与知识。  

代码如下(1)mywidget.h(随着ui一起生成的类的头文件)#ifndef MYWIDGET_H#define MYWIDGET_H#include <QWidget>namespace Ui {class MyWidget;}class one;class MyWidget : public QWidget{    Q_OBJECTpublic:    explicit MyWidget(QWidget *parent = 0);    ~MyWidget();private:    Ui::MyWidget *ui;    one *menu;};#endif // MYWIDGET_H(2)mywidget.cpp#include "mywidget.h"#include "ui_mywidget.h"#include <QPushButton>#include <one.h>MyWidget::MyWidget(QWidget *parent) :    QWidget(parent),    ui(new Ui::MyWidget){    ui->setupUi(this);    menu = new one(ui);}MyWidget::~MyWidget(){    delete ui;}(3)one.h#ifndef ONE_H#define ONE_H#include <QWidget>namespace Ui {class MyWidget;}class one:public QWidget{    Q_OBJECTpublic:    explicit one(Ui::MyWidget *ui);signals:public slots:private:    Ui::MyWidget *oneui;};#endif // ONE_H(4)one.cpp#include "one.h"#include "ui_mywidget.h"one::one(Ui::MyWidget *ui){    oneui = ui;}