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"));
}
}
}
需要源碼可以去下載:點擊打開鏈接