label->setMaximumSize(30,30);
label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); label->setScaledContents(true);
label->setPixmap(QPixmap(\ //将以上部件添加到工具栏 tool_bar->addWidget(label); tool_bar->addAction(play_action); tool_bar->addAction(stop_action);
tool_bar->addAction(skip_backward_action); tool_bar->addAction(skip_forward_action); tool_bar->addWidget(volume_slider); tool_bar->addAction(open_action);
// tool_bar->addSeparator(); //自己加的,加一条竖线 tool_bar->addAction(ReturnAction); tool_bar->addAction(closeAction);
tool_bar->setAllowedAreas(QT::TopToolBarArea |
QT::BottomToolBarArea); //创建主界面管理器
QVBoxLayout *main_layout = new QVBoxLayout; main_layout->addWidget(top_label); main_layout->addWidget(seek_slider); main_layout->addWidget(widget_bar); main_layout->addWidget(tool_bar); setLayout(main_layout); ????
以上代码中,通过定义两个QToolBar,一个是tool_bar,另一个是widget_bar,将一些按钮添加到这个类似容器的部件中,另外,最后创建一个主界面管理器,这些措施减低了布局设计的一些复杂性。主界面的实际效果如图6所示。
12
图6 播放器主界面图
4.2打开文件设计
对于一个播放器,添加歌曲功能是最重要的。 //设置添加音乐文件动作
QAction *open_action = new QAction(this); open_action->setIcon(QIcon(\ open_action->setText(tr(\播放文件(Ctrl+O)\ open_action->setShortcut(QKeySequence(\ open_action->setEnabled(true);
connect(open_action, SIGNAL(triggered()), this, SLOT(OpenFile()));
如果我们点击播放器上的添加文件按钮,其则发送一个信号triggered(),在C++中,消息就是成员函数的调用[11]。其则会进入到以下的槽函数中执行相关的代码,从而实现添加本地音频文件的目的;
void MyWidget::OpenFile() {
//可以同时打开多个音频文件
QStringList list = QFileDialog::getOpenFileNames(this,tr(\\
if(list.isEmpty()) return;
//获取当前媒体源列表的大小 int index = sources.size();
13
*.wma *.wmv)\
foreach(QString string, list) {
Phonon::MediaSource source(string); sources.append(source); }
if(!sources.isEmpty()) {
//如果媒体源列表不为空,则将新加入的第一个媒体源作为当前媒体源 meta_information_resolver->setCurrentSource(sources.at(index)); } }
通过调用QT中相关的类,默认打开当前文件夹的上一层目录,也可手动打开其他文件夹目录,添加歌曲。将添加的音频文件存放到播放列表中,如果点击播放按钮,则默认播放播放列表的第一首歌曲。以下为实际效果图如图7所示。
图7 播放器添加歌曲效果图
4.3播放歌曲设计
播放歌曲是“音乐播放器”的灵魂所在,将添加的歌曲通过播放器播放出来。
//设置播放动作
QToolBar *tool_bar = new QToolBar(this);//该构造函数没有写入文字 tool_bar->setFloatable(true); play_action = new QAction(this);
play_action->setIcon(QIcon(\ play_action->setText(tr(\播放(F5)\
play_action->setShortcut(QKeySequence(\播放的快捷键位F5
14
connect(play_action, SIGNAL(triggered()), this, SLOT(SetPaused()));
单击播放按钮(快捷键为F5),利用QT中的信号与槽机制,发送信号
triggered(),进入到以下的槽函数setpaused()中,执行具体的播放动作。 void MyWidget::SetPaused() {
if(media_object->state() == Phonon::PlayingState) { media_object->pause(); } else
media_object->play(); }
如果播放器的当前状态为正在播放歌曲,则单击该按钮的动作为播放歌曲,其实现的实际效果图(暂停)如图8所示。
图8 播放器暂停播放效果图
否则,则播放器进入到播放状态,其效果图如图9所示。
图9播放器播放歌曲效果图
15
4.4 播放上一首或下一首歌曲设计
几乎每一个播放器都有播放上一曲或下一曲的功能,本款软件也不例外,以下为播放上一曲的具体代码实现。
//设置上一首动作
skip_backward_action = new QAction(this);
skip_backward_action->setIcon(QIcon(\ skip_backward_action->setText(tr(\上一首(Ctrl+Left)\ skip_backward_action->setShortcut(QKeySequence(\ connect(skip_backward_action, SIGNAL(triggered()), this, SLOT(SkipBackward()));
由于QT中的信号与槽机制,播放器按下按钮之后,发送triggered()信号,则其进入到槽函数中执行相关动作: //播放上一首歌曲
void MyWidget::SkipBackward() {
lrc->stop_lrc_mask();
int index = sources.indexOf(media_object->currentSource()); media_object->setCurrentSource(sources.at(index - 1)); media_object->play(); }
如此,实现播放上一曲的功能。播放下一曲也差不多,其代码为:
//设置下一首动作
skip_forward_action = new QAction(this);
skip_forward_action->setIcon(QIcon(\ skip_forward_action->setText(tr(\下一首(Ctrl+Right)\ skip_forward_action->setShortcut(QKeySequence(\
connect(skip_forward_action, SIGNAL(triggered()), this, SLOT(SkipForward())); 其槽函数为:
//播放下一首歌曲
void MyWidget::SkipForward() {
lrc->stop_lrc_mask();
int index = sources.indexOf(media_object->currentSource());
16