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"));
}
}
}
需要源码可以去下载:点击打开链接