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"));

       }

    }

}

需要源碼可以去下載:點擊打開鏈接




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