1.本篇简介:
本篇主要演示QListWidget的使用,还涉及工具箱(QToolBox)和工具按钮(QToolButton)的使用,还会通过Action创建工具按钮的下拉菜单和QListWidget的组件的快捷菜单。展示如下图:
2.QListWidget
QListWidget是显示列表的组件,列表的每一项是一个QListWidgetItem对象,一个项存储了文字、图表和用户数据。
3.常用的API(Qt开发文档有所有API的介绍,建议开发时参考)
void addItem(const QString &label) //添加一项标签
void addItem(QListWidgetItem *item) //添加一项item
void insertItem(int row, QListWidgetItem *item) //在row行后添加一项item
QListWidgetItem * item(int row) //在row行的项
QListWidgetItem *takeItem(int row) //删除第row行的项,注意qt不会给你释放内存,需要手动释放,只会从界面上删除该项
void clear() //清空界面
void setAlternatingRowColors(bool) //设置是否开启交替颜色显示
常用signals:
void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) //当前项改变发出信号
void currentRowChanged(int currentRow) //当前行改变发出信号
void currentTextChanged(const QString ¤tText) //当前项改变发出信号
void itemClicked(QListWidgetItem *item) //点击项时发出信号
void itemDoubleClicked(QListWidgetItem *item) //双击发出信号
void itemEntered(QListWidgetItem *item) //鼠标进入某项发出信号
void itemPressed(QListWidgetItem *item) //鼠标按住某项发出信号
void itemSelectionChanged() //改变选择项时发出信号
4.代码展示:
部署一个ui界面:
开发顺序就按上图的数字标记,这ui画起来有点费时间,文章头部附有源码,供大家参考。
①先是开发toolbar内的toolbutton
上图共有5个ui画的button,展示其中一个实现,其他实现参考源代码。
//“初始化列表”Action
void MainWindow::on_actListIni_triggered()
{
QListWidgetItem *pmItem;
QIcon aIcon;
aIcon.addFile(":/images/icons/check2.ico");
bool chk = ui->chkBoxListEditable->isChecked(); //判断可编辑(checkBox)是否为true
ui->listWidget->clear(); //清空初始化内容
for(int i=0; i<10; i++)
{
QString str = QString("Item %1").arg(i);
pmItem = new QListWidgetItem();
pmItem->setText(str);
pmItem->setIcon(aIcon);
pmItem->setCheckState(Qt::Checked);
if(chk)
pmItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEditable |Qt::ItemIsEnabled);
else
pmItem->setFlags( Qt::ItemIsUserCheckable |Qt::ItemIsSelectable |Qt::ItemIsEnabled);
ui->listWidget->addItem(pmItem); //向listwidget添加10个Item
}
}
②为QToolButton设置Action
//为QToolButton按钮设置Action
void MainWindow::setActionsForButton()
{
ui->tBtnListIni->setDefaultAction(ui->actListIni);
ui->tBtnListClear->setDefaultAction(ui->actListClear);
ui->tBtnListInsert->setDefaultAction(ui->actListInsert);
ui->tBtnListAppend->setDefaultAction(ui->actListAppend);
ui->tBtnListDelete->setDefaultAction(ui->actListDelete);
ui->tBtnSelALL->setDefaultAction(ui->actSelALL); //全选
ui->tBtnSelNone->setDefaultAction(ui->actSelNone); //空选
ui->tBtnSelInvs->setDefaultAction(ui->actSelInvs); //反选
}
setDefaultAction:将toolbutton关联上action。
③配置全选、空选、反选按钮
//"全选"Action
void MainWindow::on_actSelALL_triggered()
{
QListWidgetItem *pmItem;
int cnt = ui->listWidget->count();
for(int i = 0; i < cnt; ++i)
{
pmItem = ui->listWidget->item(i); //遍历拿到每个item
pmItem->setCheckState(Qt::Checked);
}
}
//"空选"Action
void MainWindow::on_actSelNone_triggered()
{
QListWidgetItem *pmItem;
int cnt = ui->listWidget->count();
for(int i = 0; i < cnt; ++i)
{
pmItem = ui->listWidget->item(i); //遍历拿到每个item
pmItem->setCheckState(Qt::Unchecked);
}
}
//"反选"Action
void MainWindow::on_actSelInvs_triggered()
{
QListWidgetItem *pmItem;
int cnt = ui->listWidget->count();
for(int i = 0; i < cnt; ++i)
{
pmItem = ui->listWidget->item(i); //遍历拿到每个item
if(pmItem->checkState() == Qt::Checked)
pmItem->setCheckState(Qt::Unchecked);
else
pmItem->setCheckState(Qt::Checked);
}
}
④配置toolbar和listwidget上的项选择下拉菜单,添加退出action
void MainWindow::createSelectionMenu()
{
//创建下拉菜单
QMenu *menuSelection = new QMenu(this);
menuSelection->addAction(ui->actSelALL);
menuSelection->addAction(ui->actSelNone);
menuSelection->addAction(ui->actSelInvs);
//listWidget上方的tBtnSelectItem按钮
ui->tBtnSelectItem->setPopupMode(QToolButton::MenuButtonPopup);
ui->tBtnSelectItem->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
ui->tBtnSelectItem->setDefaultAction(ui->actSelPopMenu);
ui->tBtnSelectItem->setMenu(menuSelection);
//工具栏上的下拉式菜单按钮
QToolButton *pmBtn = new QToolButton(this);
pmBtn->setPopupMode(QToolButton::InstantPopup);
pmBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
pmBtn->setDefaultAction(ui->actSelPopMenu);
pmBtn->setMenu(menuSelection);
ui->toolBar->addWidget(pmBtn);
ui->toolBar->addSeparator(); //添加分割器
ui->toolBar->addAction(ui->actQuit); //添加退出action
}
⑤对listwidget中的Item排序操作
//是否允许排序
void MainWindow::on_chkBoxSorting_clicked(bool checked)
{
ui->listWidget->setSortingEnabled(checked);
//qDebug()<<"chkBoxSorting:"<<ui->chkBoxSorting->click();
qDebug() <<"chkBoxSorting:" <<ui->chkBoxSorting->checkState();
qDebug() <<"checked" <<checked;
}
//升序排序
void MainWindow::on_tBtnSortAsc_clicked()
{
if(ui->chkBoxSorting->checkState())
ui->listWidget->sortItems(Qt::AscendingOrder);
else
QMessageBox::information(this,"友情提醒","请打开允许排序按钮");
}
//降序排序
void MainWindow::on_tBtnSortDes_clicked()
{
if(ui->chkBoxSorting->checkState())
ui->listWidget->sortItems(Qt::DescendingOrder);
else
QMessageBox::information(this,"友情提醒","请打开允许排序按钮");
}
⑥listWidget的currentItemChanged()信号,并在toolbox中信号发射时机页中显示
void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
QString str;
if(current != NULL)
{
if(previous == NULL)
str = "当前: " +current->text();
else
str ="前一项:"+previous->text()+ ";当前: " +current->text();
ui->currentLineEdit->setText(str);
ui->plainTextEdit->appendPlainText("currentItemChanged()信号被发射");
}
}
⑦配置鼠标右击加载操作action列表
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
Q_UNUSED(pos)
ui->tBtnListIni->setDefaultAction(ui->actListIni);
ui->tBtnListClear->setDefaultAction(ui->actListClear);
ui->tBtnListInsert->setDefaultAction(ui->actListInsert);
ui->tBtnListAppend->setDefaultAction(ui->actListAppend);
ui->tBtnListDelete->setDefaultAction(ui->actListDelete);
ui->tBtnSelALL->setDefaultAction(ui->actSelALL); //全选
ui->tBtnSelNone->setDefaultAction(ui->actSelNone); //空选
ui->tBtnSelInvs->setDefaultAction(ui->actSelInvs); //反选
QMenu *pmMenuList = new QMenu(this);
pmMenuList->addAction(ui->actListIni);
pmMenuList->addAction(ui->actListClear);
pmMenuList->addAction(ui->actListInsert);
pmMenuList->addAction(ui->actListAppend);
pmMenuList->addAction(ui->actListDelete);
pmMenuList->addSeparator();
pmMenuList->addAction(ui->actSelALL);
pmMenuList->addAction(ui->actSelNone);
pmMenuList->addAction(ui->actSelInvs);
pmMenuList->exec(QCursor::pos());
ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
}