ui界面下的使用
- 这是每一项QListWidgetItem的属性值
- flags里面比较重要的属性如下
- QListWidgetItem::setFlags(); //用于设置上面flags属性
QListWidgetItem的使用
- QListWidget的每一项就是一个QListWidgetItem对象。方法如下
setText(); 设置当前项文本 setIcon(); 设置当前项图标 setCheckState(); 设置当前项的复选状态
setFlags(); 设置当前项的属性。属性值就是上上图中的内容
QListWidget的信号
注意:on_listWidget_currentItemChanged信号函数的前一项是指上一次被选中的项,而不是列表顺序中的前一项
- customContextMenuRequested(const QPoint &pos);信号
演示案例
- 初始化listwidget
void MainWindow::on_actListIni_triggered() { QListWidgetItem *aItem; QIcon aIcon; aIcon.addFile(":/Menu/circle.ico"); bool chk=ui->chkBoxListEditable->isCheckable();//编辑按钮是否被选中 ui->listWidget->clear();//清空 for(int i=0;i<10;++i) { QString str=QString::asprintf("Item %d",i); aItem=new QListWidgetItem(); aItem->setText(str);//设置文字 aItem->setIcon(aIcon);//设置图标 aItem->setCheckState(Qt::Checked); if(chk) aItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);//设置项属性 else aItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); ui->listWidget->addItem(aItem); } }
演示案例
- 删除单个项和删除所有项
//删除单个项(删除单个项,项必须被选中) void MainWindow::on_actListDelete_triggered() { int row=ui->listWidget->currentRow(); QListWidgetItem *aItem=ui->listWidget->takeItem(row); delete aItem; //takeItem函数只是移除一个项,但是还没删除。需要用delete删除 } //清除所有项 void MainWindow::on_actListClear_triggered() { ui->listWidget->clear(); }
演示案例
- 演示on_listWidget_currentItemChanged信号函数
- 注意:此信号函数的前一项是指上一次被选中的项,而不是列表顺序中的前一项
//项选择变化 void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { QString str; if(current!=NULL) { if(previous==NULL) str=QString::fromLocal8Bit("当前项")+current->text(); else str=QString::fromLocal8Bit("前一项")+previous->text()+QString::fromLocal8Bit("当前项")+current->text(); ui->editCutItemText->setText(str); } }
演示案例
- 使用customContextMenuRequested();信号创建一个右击快捷菜单
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos) { Q_UNUSED(pos); QMenu *menuList=new QMenu(this); menuList->addAction(ui->actListIni); menuList->addAction(ui->actListClear); menuList->addAction(ui->actListInsert); menuList->addAction(ui->actListAppend); menuList->addAction(ui->actListDelete); menuList->addSeparator(); menuList->addAction(ui->actSelAll); menuList->addAction(ui->actSelNone); menuList->addAction(ui->actSelInvs); menuList->exec(QCursor::pos()); //exec函数显示快捷菜单,QCursor::pos()静态函数用来获取鼠标光标的当前位置 delete menuList; }
ui界面下的操作
- 双击Tree Widget出现下面编辑框
演示案例
初始化
void MainWindow::iniTree() { QString dataStr="";//Item的Data存储的string ui->treeFiles->clear(); QIcon icon; icon.addFile(":/pic/tree.ico"); QTreeWidgetItem* item=new QTreeWidgetItem(MainWindow::itTopItem); item->setIcon(MainWindow::colItem,icon);//第1列的图片 item->setText(MainWindow::colItem,QString::fromLocal8Bit("图片文件"));//第1列的文字 item->setText(MainWindow::colItemType,"type=itTopItem");//第2列 item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsAutoTristate); item->setCheckState(colItem,Qt::Checked); item->setData(MainWindow::colItem,Qt::UserRole,QVariant(dataStr)); ui->treeFiles->addTopLevelItem(item);//添加顶层节点 }
添加目录节点
void MainWindow::on_actAddFolder_triggered() { QString dir=QFileDialog::getExistingDirectory();//文件对话框获取一个目录名称 if(!dir.isEmpty()) { QTreeWidgetItem *parItem=ui->treeFiles->currentItem();//再获取目录树的当前节点 addFolderItem(parItem,dir);//调用自定义函数添加一个组节点,新添加的节点将会作为当前节点的子节点 } } //根绝传递来的父节点和目录全称dirName,创建并添加节点 void MainWindow::addFolderItem(QTreeWidgetItem *parItem,QString dirName) { QIcon icon(":/pic/tree.ico"); QString NodeText=getFinalFolderName(dirName);//获取目录全称的最后一级的文件夹名称 QTreeWidgetItem *item=new QTreeWidgetItem(MainWindow::itGroupItem);//创建一个分组节点 item->setIcon(colItem,icon); item->setText(colItem,NodeText); item->setText(colItem,"type=itGroupItem"); item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsAutoTristate); item->setCheckState(colItem,Qt::Checked); item->setData(colItem,Qt::UserRole,QVariant(dirName));//设置关联数据,关联数据就是目录的全路径字符串 parItem->addChild(item);//将创建的节点作为父节点的一个子节点添加到目录树 } //获取目录全称的最后一级的文件夹名称,这个名称将作为新建节点的标题 QString MainWindow::getFinalFolderName(const QString& fullPathName) { int cnt=fullPathName.length(); int i=fullPathName.lastIndexOf("/"); QString str=fullPathName.right(cnt-i-1); return str; }
添加文件节点
addImageItem()根据图片文件名称,创建一个节点并添加到父节点下面。在使用setData()设置节点数据时,将图片带路径的文件名aFileName作为节点的数据,这个数据在单击节点打开图片时会用到
void MainWindow::on_actAddFiles_triggered() { QStringList files=QFileDialog::getOpenFileNames(this,"选择一个或多个文件","","Image(*.jpg)");//获取图片文件列表 if(files.isEmpty()) return; QTreeWidgetItem* parItem,*item; item=ui->treeFiles->currentItem(); if(item->type()==itImageItem)//type()返回节点的类型 parItem=item->parent(); else parItem=item; for(int i=0;i
setIcon(colItem,icon); item->setText(colItem,NodeText); item->setText(colItem,"type=itImageItem"); item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsAutoTristate); item->setCheckState(colItem,Qt::Checked); item->setData(colItem,Qt::UserRole,QVariant(aFileName)); parItem->addChild(item); }
当前节点变化后的响应
当目录树当前节点变化时,会发生currentItemChanged()信号
void MainWindow::on_treeFiles_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { Q_UNUSED(previous); if(current==NULL) return; int var=current->type(); switch (var) { case itTopItem: ui->actAddFolder->setEnabled(true); ui->actAddFiles->setEnabled(true); ui->actDeleteItem->setEnabled(false); break; case itGroupItem: ui->actAddFolder->setEnabled(true); ui->actAddFiles->setEnabled(true); ui->actDeleteItem->setEnabled(true); break; case itImageItem: ui->actAddFolder->setEnabled(false); ui->actAddFiles->setEnabled(true); ui->actDeleteItem->setEnabled(true); break; } }
节点的遍历
目录树的节点都是QTreeWidgetItem类型。遍历节点需要用到QTreeWidgetItem类的一些关键函数
void MainWindow::on_actScanItems_triggered() { //topLevelItemCount返回顶层节点个数 for(int i=0;i
treeFiles->topLevelItemCount();++i) { QTreeWidgetItem *item=ui->treeFiles->topLevelItem(i);//返回序号为i的顶层节点 changeItemCaption(item);//调用自定义函数 } } //此函数获取顶层节点,然后改变这个节点和所有子节点的标题 void MainWindow::changeItemCaption(QTreeWidgetItem *item) { QString str="*"+item->text(colItem);//在标题前加*号,这是我们自己设计的 item->setText(colItem,str); if(item->childCount()>0)//判断此顶节点是否有子节点 { for(int i=0;i childCount();++i) changeItemCaption(item->child(i));//递归调用 } }
节点的删除
一个节点不能移除自己,需要获取其父节点,使用父节点的removeChild函数来移除自己。但是该函数不从内存删除它,所以还需要调用delete
若删除顶层节点,使用QTreeWidget::takeTopLevelItem(int index)函数
void MainWindow::on_actDeleteItem_triggered() { QTreeWidgetItem *item=ui->treeFiles->currentItem(); QTreeWidgetItem *parItem=item->parent(); parItem->removeChild(item); delete item; }
基本使用
- 行表头(Columns):行的第一行为行标头,用于设置每一列的标题
- 列表头(Rows):第一列为列表头,可以设置其标题
QTableWidgetItem对象
- 除去行表头与列表头之外的表格区编辑区,每个网格单元称为一个单元格,一个单元格就是一个QTableWidgetItem对象
- 每个单元格都有一个行号和列号(行号和列号下标从0开始)
- 每个单元格可以设置文字内容、字体、前景色、背景色、图标,也可以设置编辑和显示标记
- 每个单元格还可以存储一个QVariant数据,用于设置用户自定义数据
customContexMenuRequsted信号
- 如果使用这个信号还必须更改TableWidget的属性,可以在UI界面设置或者使用代码设置
ui->seedsListWidget->setContextMenuPolicy(Qt::CustomContextMenu);
演示案例
①成员定义、构造函数与界面设计
②设置表头
- void QTableWidget::setHorizontalHeaderItem(int column, QTableWidgetItem *item); //在TableWidget第column列设置一个表头对象
- void QTableWidget::setHorizontalHeaderLabels(const QStringList&labels); //直接一次性设置TableWidget的所有列表头
int QTableWidget::columnCount(); //返回TableWidget列数
void QTableWidget::setColumnCount(int columns); //设置TableWidget的列数
void QTableWidgetItem::setTextColor(const QColor&color); //设置单元格文本颜色
void QTableWidgetItem::setFont(const QFont&font); //设置单元格字体格式
void QTableWidgetItem::setBackground(const QBrush &brush); //设置单元格背景色
void QTableWidgetItem::setBackgroundColor(const QColor &color); //设置单元格背景色,建议使用上面那个函数
void QTableWidgetItem::setForeground(const QBrush &brush); //设置单元格前景色
下面我们使用setHorizontalHeaderItem循环添加列表头,因为这样可以设置每个列表头的格式
//设置表头函数 void MainWindow::on_btnSetHeader_clicked() { QTableWidgetItem *headerItem; QStringList headerText; headerText<
tableInfo->setColumnCount(headerText.count()); //ui->tableInfo->setHorizontalHeaderLabels(headerText); for(int i=0;i tableInfo->columnCount();++i) { headerItem=new QTableWidgetItem(headerText.at(i)); QFont font=headerItem->font(); font.setBold(true);//粗体 font.setPointSize(12);//字体大小 headerItem->setTextColor(Qt::red);//字体颜色 headerItem->setFont(font);//设置字体 ui->tableInfo->setHorizontalHeaderItem(i,headerItem); } } ③初始化QTableWidget
void QTableWidget::clearContents(); //清除TableWidget表格数据区的所有内容,但不清除表头
int QTableWidget::rowCount() const; //返回TableWidget的总行数
int QTableWidget::currentRow() const; //返回当前鼠标所在的行索引
void QTableWidgetItem::setTextAlignment(int alignment); //设置单元格文字对齐方式
void QTableWidgetItem::setData(int role, const QVariant &value); //为单元格设置一个自定义数据,这个数据不在单元格显示,但是与单元格关联
void QTableWidget::setItem(int row, int column, QTableWidgetItem *item); //在第row行第column列设置一个QTableWidgetItem对象
void QTableWidgetItem::setIcon(const QIcon &icon); //为单元格设置一个图标
void QTableWidgetItem::setCheckState(Qt::CheckState state); //设置单元格勾选状态,单元格出现一个QCheckBox组件
//初始化QTableWidget void MainWindow::on_btnIniData_clicked() { QString strName,strSex;//姓名、性别 bool isParty=false;//是否为党员 QDate birth;//出生日期 birth.setDate(1980,4,7); ui->tableInfo->clearContents();//清除所有数据 int Rows=ui->tableInfo->rowCount();//得到行数 for(int i=0;i
setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//单元格文字对齐方式 StudID+=rowNo; item->setData(Qt::UserRole,QVariant(StudID));//设置单元格关联数据 ui->tableInfo->setItem(rowNo,MainWindow::colName,item);//在rowNo行colName列添加一个单元格对象 //性别 QIcon icon; if(Sex=="男") icon.addFile(":/icon/man.ico"); else icon.addFile(":/icon/woman.ico"); item=new QTableWidgetItem(Sex,MainWindow::ctSex); item->setIcon(icon);//设置单元格图标 item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); ui->tableInfo->setItem(rowNo,MainWindow::colSex,item); //出生日期 str=birth.toString("yyyy-MM-dd"); item=new QTableWidgetItem(str,MainWindow::ctBirth); item->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); ui->tableInfo->setItem(rowNo,MainWindow::colBirth,item); //民族 item=new QTableWidgetItem(Nation,MainWindow::ctNation); item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); ui->tableInfo->setItem(rowNo,MainWindow::colNation,item); //是否党员 item=new QTableWidgetItem(QStringLiteral("党员"),MainWindow::ctPartyM); item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); if(isPM) item->setCheckState(Qt::Checked); else item->setCheckState(Qt::Unchecked); item->setBackgroundColor(Qt::yellow);//设置单元格背景色 ui->tableInfo->setItem(rowNo,MainWindow::colPartyM,item); //分数 str.setNum(score); item= new QTableWidgetItem(str,MainWindow::ctScore); item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); ui->tableInfo->setItem(rowNo,MainWindow::colScore,item); } ④currentCellChanged、currentItemChanged信号
当鼠标在单元格之间切换时,会触发这两个信号。两个信号使用原理相同,只是参数不同
QTableWidgetItem *QTableWidget::item(int row, int column) const; //获取第row行第column列的单元格对象
int QTableWidgetItem::type() const; //返回单元格类型
QVariant QTableWidgetItem::data(int role) const; //获取setData函数设置的单元格的自定义数据
//当鼠标在单元格之间切换时,获取信息,并设置QLabel的内容 void MainWindow::on_tableInfo_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) { QTableWidgetItem *item=ui->tableInfo->item(currentRow,currentColumn); if(item==NULL) return; labCellIndex->setText(QString::asprintf("当前单元格坐标:%d行,%d列",currentRow,currentColumn)); int CellType=item->type(); labCellType->setText(QString::asprintf("当前单元格类型:%d",CellType)); item=ui->tableInfo->item(currentRow,MainWindow::colName); int ID=item->data(Qt::UserRole).toInt(); labStudId->setText(QString::asprintf("学生ID:%d",ID)); } void MainWindow::on_tableInfo_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) { }
⑤添加行、插入行、删除行
void QTableWidget::insertRow(int row); //在row的前面插入一行。如果row等于大于总行数,则在表格最后一行添加一行。此函数只是插入一个空行,不会为单元格创建QTableWidgetItem对象,需要自己手动创建
void QTableWidget::removeRow(int row); //删除行号为row的行
//插入行 void MainWindow::on_btnInsertRow_clicked() { int curRow=ui->tableInfo->currentRow(); ui->tableInfo->insertRow(curRow); createItemsARow(curRow,"新学生","男", QDate::fromString("1990-1-1","yyyy-M-d"),"苗族",true,70); } //添加行 void MainWindow::on_btnAppendRow_clicked() { int curRow=ui->tableInfo->rowCount(); ui->tableInfo->insertRow(curRow); createItemsARow(curRow,"新学生","女", QDate::fromString("2000-1-1","yyyy-M-d"),"满族",false,70); } //删除行 void MainWindow::on_btnDelCurRow_clicked() { int curRow=ui->tableInfo->currentRow(); ui->tableInfo->removeRow(curRow); }
⑥其它属性
- void setEditTriggers(EditTriggers triggers); //设置QTableWidget是否可编辑,以及进入编辑的状态
QHeaderView *QTableView::horizontalHeader() const; //获取行标头
QHeaderView *QTableView::verticalHeader() const; //获取列表头
void QHeaderView::setVisible(bool v); //设置表头是否显示
void setAlternatingRowColors(bool enable); //设置QTableWidget是否使用间隔交替底色显示。若为交替底色,则间隔的行使用灰色作为底色。具体底色的设置需要调用styleSheet
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior); //设置QTableWidget是单元格选择还是行选择
//设置表格内容是否可编辑 void MainWindow::on_chkBoxTabEdittable_clicked(bool checked) { if(checked) ui->tableInfo->setEditTriggers(QAbstractItemView::DoubleClicked| QAbstractItemView::SelectedClicked); else ui->tableInfo->setEditTriggers(QAbstractItemView::NoEditTriggers); } //设置行表头是否显示 void MainWindow::on_chkBoxHeaderH_clicked(bool checked) { ui->tableInfo->horizontalHeader()->setVisible(checked); } //设置列表头是否显示 void MainWindow::on_chkBoxHeaderV_clicked(bool checked) { ui->tableInfo->verticalHeader()->setVisible(checked); } //设置QTableWidget间隔行底色 void MainWindow::on_chkBoxRowColor_clicked(bool checked) { ui->tableInfo->setAlternatingRowColors(checked); } //设置QTableWidget为单元格选择 void MainWindow::on_rBtnSelectRow_clicked() { ui->tableInfo->setSelectionBehavior(QAbstractItemView::SelectItems); } //设置QTableWidget为行选择 void MainWindow::on_rBtnSelectItem_clicked() { ui->tableInfo->setSelectionBehavior(QAbstractItemView::SelectRows); }
⑦遍历表格的数据
- QString QTableWidgetItem::text() const; //获取一个单元格的数据
- Qt::CheckState QTableWidgetItem::checkState() const; //如果setCheckState函数设置单元格为勾选状态,用此函数可以判断是否为选中状态
//遍历QTableWidget的所有数据并添加到下方的文本框中 void MainWindow::on_btnReadToEdit_clicked() { QString str; QTableWidgetItem *cellItem; ui->textEdit->clear(); for(int i=0;i
tableInfo->rowCount();++i)//先遍历行 { str=QString::asprintf("第%d行",i+1); for(int j=0;j tableInfo->columnCount()-1;++j)//再遍历列 { cellItem=ui->tableInfo->item(i,j);//获取单元格对象 str=str+cellItem->text()+" ";//获取单元格数据并拼接字符串 } cellItem=ui->tableInfo->item(i,MainWindow::colPartyM);//获取党员那一行的单元格对象 if(cellItem->checkState()==Qt::Checked)//判断是否选中,是否为党员 str=str+"党员"; else str=str+"群众"; ui->textEdit->appendPlainText(str); } }