QListWidget实现较复杂的列表-仿音乐歌曲列表

1、QListWidget介绍

   Qt助手的介绍:The QListWidget class providesan item-based list widget. QListWidget is a convenience class that provides alist view similar to the one supplied by QListView,but with a classic item-based interface for adding and removing items.QListWidget uses an internal model to manage each QListWidgetItem in the list英文很简单,就不翻译了,多使用Qt助手,越用越酸爽,酸在于啃英文,爽在于学到更多的东西。QListWidget的好处在于简单、使用方便,用来做列表或者入门学习是个不错的选择,这次使用QListWidget做个仿音乐歌曲列表和大家一起学习,完成效果如图1。


 图1

2、建立Qt Gui工程和布局

   其中选择QWidget为基类,建立工程完成后进入界面设计器中,将ListWidget控件拖入界面中,为了演示其效果,我添加了输入框作为输入歌曲信息,然后添加到列表中,界面布局如图2。


图2

3、主要代码

    先介绍主要思路,每一首歌曲代表一行,而歌曲有选择下载、试听、收藏等操作选项,不能只单纯的显示,如图3.1,红色的使用的QToolButton按钮,蓝色使用的是QLabel。


图3.1

将这些QToolButton和QLabel组成一个Widget,然后放进QListWidget,即一行,这用到最关键的函数:

voidQListWidget::setItemWidget(QListWidgetItem * i tem, QWidget * widget);

术语一点就是:外观布局使用QListWidget,将QToolButton、QLabel和QLayout写成自己定义的QListWidgetItem控件集合,用setItemWidget函数加载到QListWidget中去。

主要代码如下:

#include"music_list.h"

#include"ui_music_list.h"

#include<QGridLayout>

#include<QListWidget>

#include<QPixmap>

 

 

Music_List::Music_List(QWidget*parent):

    QWidget(parent),

    ui(newUi::Music_List)

{

    ui->setupUi(this);

    ui->listWidget->setResizeMode(QListView::Adjust);

    ui->listWidget->setAutoScroll(true);

 

    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(addSing()));

    connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(show_more_message(QListWidgetItem*)));  //将点中的该行放大一点

}

 

//新建一个ListWidgetItem,将一首歌的信息加入列表中

voidMusic_List::Add_ListWidgetItem(sing_message&message)

{

    QWidget*WContainer=newQWidget(ui->listWidget);//新建一个QWidget窗口

 

    chooseBtn=newQToolButton;                           //歌曲选中按钮

    chooseBtn->setToolButtonStyle(Qt::ToolButtonIconOnly);  //只显示图片

    chooseBtn->setIconSize(QSize(20,20));                   //按钮大小

    chooseBtn->setIcon(QIcon(":/images/choose.png"));       //添加图片

    chooseBtn->setStyleSheet("QToolButton{background-color:transparent}");//背景透明

    connect(chooseBtn,SIGNAL(clicked(bool)),this,SLOT(change_chooseBtn()));

 

    name=newQLabel;                                  //歌曲名称

    name->setText(message.name);

    MVBtn=newQToolButton;                           //MV按钮

    MVBtn->setToolButtonStyle(Qt::ToolButtonIconOnly);  //只显示图片

    MVBtn->setIconSize(QSize(20,20));                   //按钮大小

    MVBtn->setStyleSheet("QToolButton{background-color:transparent}");//背景透明

    if(!(message.mv_empty.isEmpty()))

    {

       MVBtn->setIcon(QIcon(":/images/mv.png"));   //添加图片

    }

    else

    {

       //不显示按钮或者不添加进去

    }

    time=newQLabel(message.time);

    size=newQLabel(message.size);

    heat=newQLabel;

    if(message.heat==2)

    {

       QPixmapicon(":/images/2st.png");

       heat->setPixmap(icon);

       heat->resize(icon.width(),icon.height());//图片填充满Label

    }

    elseif(message.heat==3)

    {

       QPixmapicon(":/images/3st.png");

       heat->setPixmap(icon);

       heat->resize(icon.width(),icon.height());//图片填充满Label

    }

    elseif(message.heat==4)

    {

       QPixmapicon(":/images/4st.png");

       heat->setPixmap(icon);

       heat->resize(icon.width(),icon.height());//图片填充满Label

    }

 

    listenBtn=newQToolButton;

    listenBtn->setToolButtonStyle(Qt::ToolButtonIconOnly);  //只显示图片

    listenBtn->setIconSize(QSize(20,20));                   //按钮大小

    listenBtn->setIcon(QIcon(":/images/play.png"));         //添加图片

    listenBtn->setStyleSheet("QToolButton{background-color:transparent}");//背景透明

 

    addBtn=newQToolButton;

    addBtn->setToolButtonStyle(Qt::ToolButtonIconOnly);  //只显示图片

    addBtn->setIconSize(QSize(20,20));                   //按钮大小

    addBtn->setIcon(QIcon(":/images/add.png"));          //添加图片

    addBtn->setStyleSheet("QToolButton{background-color:transparent}");//背景透明

 

    downloadBtn=newQToolButton;

    downloadBtn->setToolButtonStyle(Qt::ToolButtonIconOnly);  //只显示图片

    downloadBtn->setIconSize(QSize(20,20));                   //按钮大小

    downloadBtn->setIcon(QIcon(":/images/down.png"));         //添加图片

    downloadBtn->setStyleSheet("QToolButton{background-color:transparent}");//背景透明

    connect(downloadBtn,SIGNAL(clicked(bool)),this,SLOT(dowmloadBtn_Change()));

 

    lingBtn=newQToolButton;

    lingBtn->setToolButtonStyle(Qt::ToolButtonIconOnly);  //只显示图片

    lingBtn->setIconSize(QSize(20,20));                   //按钮大小

    lingBtn->setIcon(QIcon(":/images/ling.png"));         //添加图片

    lingBtn->setStyleSheet("QToolButton{background-color:transparent}");//背景透明

 

    musicBtn=newQToolButton;

    musicBtn->setToolButtonStyle(Qt::ToolButtonIconOnly);  //只显示图片

    musicBtn->setIconSize(QSize(20,20));                   //按钮大小

    musicBtn->setIcon(QIcon(":/images/unkown.png"));       //添加图片

    musicBtn->setStyleSheet("QToolButton{background-color:transparent}");//背景透明

 

    QGridLayout*Glayout=newQGridLayout;

    Glayout->addWidget(chooseBtn,0,0);

    Glayout->addWidget(name,0,1);

    Glayout->addWidget(MVBtn,0,2);

    Glayout->addWidget(time,0,3);

    Glayout->addWidget(size,0,4);

    Glayout->addWidget(heat,0,5);

    Glayout->addWidget(listenBtn,0,6);

    Glayout->addWidget(addBtn,0,7);

    Glayout->addWidget(downloadBtn,0,8);

    Glayout->addWidget(lingBtn,0,9);

    Glayout->addWidget(musicBtn,0,10);

    //QBoxLayout::setContentsMargins(11,0,0,11);

    WContainer->setLayout(Glayout);

    QListWidgetItem*WContainerItem=newQListWidgetItem(ui->listWidget);

    WContainerItem->setSizeHint(QSize(40,40));

    WContainerItem->setToolTip(name->text()+size->text()+message.formats+message.timbre);

    ui->listWidget->setItemWidget(WContainerItem,WContainer);//将WContainer赋予WContainerItem

}

 

//获取歌曲信息

voidMusic_List::addSing()

{

    sing_messagemessage;

    message.name=ui->namelineEdit->text();

    message.mv_empty=ui->mvlineEdit->text();

    message.time=ui->timelineEdit->text();

    message.size=ui->biglineEdit->text();

    message.heat=ui->holdlineEdit->text().toInt();

    message.timbre=tr("优质");

    message.formats=tr("文件格式:MP3");

    message.rate=tr("码率:128kbps");

 

    Add_ListWidgetItem(message);

}

 

//点中选中歌曲的按钮

voidMusic_List::change_chooseBtn()

{

    QToolButton*Btn=qobject_cast<QToolButton*>(sender());//新建一个object关于QToolButton的对象

    if(!Btn)

    {

       return;

    }

    for(inti=0;i<ui->listWidget->count();i++)

    {

       if(Btn->parentWidget()==ui->listWidget->itemWidget(ui->listWidget->item(i)))//获得指向当前选中的item

       {

           Btn->setIcon(QIcon(":/images/haschoose.png"));

           ui->listWidget->item(i)->setBackgroundColor(QColor(0,200,200,255));//更换item的背景颜色

       }

    }

}

 

//点中选择下载按钮

voidMusic_List::dowmloadBtn_Change()

{

    QToolButton*DBtn=qobject_cast<QToolButton*>(sender());//新建一个object关于QToolButton的对象

    if(!DBtn)

    {

       return;

    }

    for(inti=0;i<ui->listWidget->count();i++)

    {

       if(DBtn->parentWidget()==ui->listWidget->itemWidget(ui->listWidget->item(i)))//获得指向当前选中的item

       {

           DBtn->setIcon(QIcon(":/images/ok.png"));

       }

    }

}

需要源码可以去下载:点击打开链接




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章