QT基础:18---Item Widgets控件的使用

一、List  Widget

  • QListWidget是存储多个项的列表组件,每个项是一个QListWidgetItem类型的对象

ui界面下的使用

  • 这是每一项QListWidgetItem的属性值

QT基础:18---Item Widgets控件的使用_第1张图片

  • flags里面比较重要的属性如下

QT基础:18---Item Widgets控件的使用_第2张图片

  • QListWidgetItem::setFlags(); //用于设置上面flags属性

QListWidgetItem的使用

  • QListWidget的每一项就是一个QListWidgetItem对象。方法如下
setText(); 设置当前项文本
setIcon(); 设置当前项图标
setCheckState();

设置当前项的复选状态

QT基础:18---Item Widgets控件的使用_第3张图片

setFlags(); 设置当前项的属性。属性值就是上上图中的内容

QListWidget的信号

注意:on_listWidget_currentItemChanged信号函数的前一项是指上一次被选中的项,而不是列表顺序中的前一项 

QT基础:18---Item Widgets控件的使用_第4张图片

  • customContextMenuRequested(const QPoint &pos);信号

演示案例

  • 初始化listwidget

QT基础:18---Item Widgets控件的使用_第5张图片

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

演示案例

  • 删除单个项和删除所有项

QT基础:18---Item Widgets控件的使用_第6张图片

//删除单个项(删除单个项,项必须被选中)
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信号函数
  • 注意:此信号函数的前一项是指上一次被选中的项,而不是列表顺序中的前一项

QT基础:18---Item Widgets控件的使用_第7张图片

//项选择变化
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;
}

二、Tree  Widget

 QT基础:18---Item Widgets控件的使用_第8张图片

ui界面下的操作

  • 双击Tree Widget出现下面编辑框

QT基础:18---Item Widgets控件的使用_第9张图片

QT基础:18---Item Widgets控件的使用_第10张图片

演示案例

QT基础:18---Item Widgets控件的使用_第11张图片.

QT基础:18---Item Widgets控件的使用_第12张图片

QT基础:18---Item Widgets控件的使用_第13张图片

  • 初始化

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);//添加顶层节点
}

QT基础:18---Item Widgets控件的使用_第14张图片

  • 添加目录节点

QT基础:18---Item Widgets控件的使用_第15张图片

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;
}
  • 添加文件节点

QT基础:18---Item Widgets控件的使用_第16张图片

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;isetIcon(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;
    }
}
  •  节点的遍历

QT基础:18---Item Widgets控件的使用_第17张图片

目录树的节点都是QTreeWidgetItem类型。遍历节点需要用到QTreeWidgetItem类的一些关键函数

void MainWindow::on_actScanItems_triggered()
{
    //topLevelItemCount返回顶层节点个数
    for(int i=0;itreeFiles->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;ichildCount();++i)
            changeItemCaption(item->child(i));//递归调用
    }
}
  • 节点的删除

QT基础:18---Item Widgets控件的使用_第18张图片

一个节点不能移除自己,需要获取其父节点,使用父节点的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;
}

三、Table Widget

QT基础:18---Item Widgets控件的使用_第19张图片

  • QTableWidget是表格组件类

基本使用

QT基础:18---Item Widgets控件的使用_第20张图片QT基础:18---Item Widgets控件的使用_第21张图片

  • 行表头(Columns):行的第一行为行标头,用于设置每一列的标题
  • 列表头(Rows):第一列为列表头,可以设置其标题

QTableWidgetItem对象

  • 除去行表头与列表头之外的表格区编辑区,每个网格单元称为一个单元格,一个单元格就是一个QTableWidgetItem对象
  • 每个单元格都有一个行号和列号(行号和列号下标从0开始)
  • 每个单元格可以设置文字内容、字体、前景色、背景色、图标,也可以设置编辑和显示标记
  • 每个单元格还可以存储一个QVariant数据,用于设置用户自定义数据

customContexMenuRequsted信号

QT基础:18---Item Widgets控件的使用_第22张图片

  • 如果使用这个信号还必须更改TableWidget的属性,可以在UI界面设置或者使用代码设置

QT基础:18---Item Widgets控件的使用_第23张图片

ui->seedsListWidget->setContextMenuPolicy(Qt::CustomContextMenu);

演示案例 

①成员定义、构造函数与界面设计

QT基础:18---Item Widgets控件的使用_第24张图片

QT基础:18---Item Widgets控件的使用_第25张图片

QT基础:18---Item Widgets控件的使用_第26张图片

②设置表头

QT基础:18---Item Widgets控件的使用_第27张图片

  • 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;itableInfo->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

QT基础:18---Item Widgets控件的使用_第28张图片

  • 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;isetTextAlignment(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函数设置的单元格的自定义数据

QT基础:18---Item Widgets控件的使用_第29张图片

//当鼠标在单元格之间切换时,获取信息,并设置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)
{
    
}

⑤添加行、插入行、删除行

QT基础:18---Item Widgets控件的使用_第30张图片

  • 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);
}

⑥其它属性

QT基础:18---Item Widgets控件的使用_第31张图片

  • 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);
}

⑦遍历表格的数据

QT基础:18---Item Widgets控件的使用_第32张图片

  • 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;itableInfo->rowCount();++i)//先遍历行
    {
        str=QString::asprintf("第%d行",i+1);
        for(int j=0;jtableInfo->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);
    }
}

 

你可能感兴趣的:(QT基础)