Qt学习(三)QTreeWdiget, QDockWidget,QTableWidget

一 QTreeWdiget 下拉列表

添加节点,删除节点,修改节点的名字

  • 知识点1:实现多选
    //设置允许一次选中多个选项
    ui->treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

在这里插入图片描述

  • 知识点2:实现对选中内容的修改
        //配置新建item属性,添加这行代码之后,可以双击选中的节点进行内容的修改
        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

在这里插入图片描述

  • 知识点3:对无序内容的删除
void MainWindow::on_actionDelete_triggered()
{
    //是删除当前选项,还是删除多个选项
   auto items = ui->treeWidget->selectedItems();  //返回不一定是顺序的,需要测试一下
   for(auto it = items.constBegin(); it != items.constEnd();it++){
       QTreeWidgetItem *item = *it;  //it是一个特殊指针,*it是解引用,得到数据对应的指针
       //不能for循环删,也最好不要像前面一样倒顺序删,因为不知道顺序是不是乱的,这种情况for循环删会导致编号混乱
       if(item->parent()){
           //找到item当前的序号
           int index = item->parent()->indexOfChild(item);
           item->parent()->takeChild(index);
       }else
       {
           int index = ui->treeWidget->indexOfTopLevelItem(item);
           ui->treeWidget->takeTopLevelItem(index);
       }
   }

}
  • 点击列,选择左下角+,可以编辑和添加第一级信息,点击项目,选择左下角+,可以编辑和添加第2级信息,对应的组件名为tree Widget
    在这里插入图片描述
  • 效果展示

在这里插入图片描述

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionInsert_triggered();

    void on_actionDelete_triggered();

private:
    Ui::MainWindow *ui;
    void initUI();
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QAbstractItemView>
#include <QTreeWidget>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initUI();
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::initUI()
{
    ui->treeWidget->clear();


    //设置treeWidget的列数
    ui->treeWidget->setColumnCount(2);
    ui->treeWidget->setHeaderLabels(QStringList({"课程","说明"}));

    //设置允许一次选中多个选项
    ui->treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

    QTreeWidgetItem *root1 = new QTreeWidgetItem(ui->treeWidget);
    root1->setText(0,"C语言");
    root1->setText(1,"开发语言");

    QIcon iocn;
    iocn.addFile(":/images/fold.png");
    root1->setIcon(0,iocn);

    QStringList list1 = {"数据类型","程序控制","结构体","指针"};
    for(int i = 0; i < list1.count(); i++){
        auto *item = new QTreeWidgetItem(root1);
        item->setText(0, list1[i]);
        item->setText(1, "熟练掌握");
        root1->addChild(item);
        //配置新建item属性,添加这行代码之后,可以双击选中的节点进行内容的修改
        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

    }


    QStringList list2 = {"if 判断","swith","for 循环"};
    auto itemControl = root1->child(1);
    for(int i = 0; i < list2.count(); i++){
        auto *item = new QTreeWidgetItem(itemControl);
        item->setText(0, list2[i]);
        item->setText(1, "熟练掌握");
        itemControl->addChild(item);
        //配置新建item属性,添加这行代码之后,可以双击选中的节点进行内容的修改
        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

    }

    //--------------------------------------
    auto root2 = new QTreeWidgetItem(ui->treeWidget);
    root2->setText(0,"C++");
    root2->setText(1,"语言进阶");
    root2->setIcon(0,iocn);
    QStringList list3 = {"类和对象","继承与派生","运算符重载","虚函数"};
    for(int i = 0; i < list3.count(); i++){
        auto *item = new QTreeWidgetItem(root2);
        item->setText(0, list3[i]);
        item->setText(1, "熟练掌握");
        root2->addChild(item);
        //配置新建item属性,添加这行代码之后,可以双击选中的节点进行内容的修改
        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);
    }

    ui->treeWidget->addTopLevelItem(root1);
    ui->treeWidget->addTopLevelItem(root2);
}


void MainWindow::on_actionInsert_triggered()
{
    //获取当前选中项
    QTreeWidgetItem *item = ui->treeWidget->currentItem();
    if(item && item->isSelected()){
        auto itemNew = new QTreeWidgetItem();
        itemNew->setText(0,"未命名");
        itemNew->setText(1,"未命名");

        //配置新建item属性,添加这行代码之后,可以双击选中的节点进行内容的修改
        itemNew->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

        //判断是不是顶层的节点
        auto parent = item->parent();
        if(parent){
            parent->insertChild(ui->treeWidget->currentIndex().row(),itemNew);
        }
        else
        {
            QIcon iocn;
            iocn.addFile(":/images/fold.png");
            itemNew->setIcon(0,iocn);
            ui->treeWidget->insertTopLevelItem(ui->treeWidget->currentIndex().row(),itemNew);
        }
    }
}

void MainWindow::on_actionDelete_triggered()
{
    //是删除当前选项,还是删除多个选项
   auto items = ui->treeWidget->selectedItems();  //返回不一定是顺序的,需要测试一下
   for(auto it = items.constBegin(); it != items.constEnd();it++){
       QTreeWidgetItem *item = *it;  //it是一个特殊指针,*it是解引用,得到数据对应的指针
       //不能for循环删,也最好不要像前面一样倒顺序删,因为不知道顺序是不是乱的,这种情况for循环删会导致编号混乱
       if(item->parent()){
           //找到item当前的序号
           int index = item->parent()->indexOfChild(item);
           item->parent()->takeChild(index);
       }else
       {
           int index = ui->treeWidget->indexOfTopLevelItem(item);
           ui->treeWidget->takeTopLevelItem(index);
       }
   }

}

二 QDockWidget 浮动窗口组件

  • 当前案例实现的功能:选中人头,显示,再次选中,不显示相应的古诗词,关闭浮动窗口,要求人头变成未选中状态

在这里插入图片描述
在这里插入图片描述

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionTang_triggered(bool checked);
    void on_actionSong_triggered(bool checked);
    void on_dockWidgetTang_visibilityChanged(bool visible);
    void on_dockWidgetSong_visibilityChanged(bool visible);
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionTang_triggered(bool checked)
{
    ui->dockWidgetTang->setVisible(checked);
}

void MainWindow::on_actionSong_triggered(bool checked)
{
    ui->dockWidgetSong->setVisible(checked);
}

void MainWindow::on_dockWidgetTang_visibilityChanged(bool visible)
{
    ui->actionTang->setChecked(visible);
}

void MainWindow::on_dockWidgetSong_visibilityChanged(bool visible)
{
    ui->actionSong->setChecked(visible);
}

三 QTableWidget 创建表格

在这里插入图片描述

  • 实现效果:实现查找功能,并有色显示,多选,增加,删除以及编辑

在这里插入图片描述

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionInsert_triggered();

    void on_actionDelete_triggered();

    void on_pushButton_clicked();

    void on_tableWidget_cellClicked(int row, int column);

private:
    Ui::MainWindow *ui;
    void initTableData();
    void CreateRow(int rwoIndex, QString name, int ID, QString sex, QDate birthday, QString job, bool married);

    int maxNumber;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDate>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //setCentralWidget(ui->tableWidget);

    maxNumber = 0;

    initTableData();

    // 禁止表格可编辑
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    qDebug() << ui->tableWidget->editTriggers();

    //显示鼠标选中的表格为指定的颜色
    ui->tableWidget->setStyleSheet("selection-background-color:rbg(0,0,255)");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initTableData()
{


    ui->tableWidget->clear();

    QStringList headStr = {"姓名","性别","出生日期","职位","是否已婚"};
    ui->tableWidget->setColumnCount(headStr.count());

    for(int i = 0; i < ui->tableWidget->columnCount(); i++){
        QTableWidgetItem *item = new QTableWidgetItem(headStr[i]);

        QFont font = item->font();
        font.setBold(true);
        font.setFamily("微软雅黑");
        font.setPointSize(12);

        item->setFont(font);
        item->setBackground(Qt::red);

        //设置每一列的表头
        ui->tableWidget->setHorizontalHeaderItem(i,item);
    }

    //调整数据行宽和列宽随着窗口的拉动自动变化
    QHeaderView *headview = ui->tableWidget->horizontalHeader(); //取出表头
    headview->setSectionResizeMode(QHeaderView::Stretch);

    //指定某一列数据的宽度不随窗口的拉动而变化
    headview->setSectionResizeMode(1,QHeaderView::Fixed);
    ui->tableWidget->setColumnWidth(1,100);

    //手动填充数据,这里只是为了演示
    int row = 100;
    ui->tableWidget->setRowCount(row);
    QStringList jobs = {"软件工程师","测试工程师","硬件工程师"};
    for(int i =0; i< row; i++)
    {
        maxNumber++;
        CreateRow(i,
                  QString::asprintf("员工%d",maxNumber),
                  maxNumber,
                  rand()%2 ?"male":"fmale",
                  QDate(rand()%10+2000, rand()%12+1, rand()%28+1),
                  jobs[rand()%jobs.count()],
                  rand()%2);
    }
}

void MainWindow::CreateRow(int rwoIndex, QString name, int ID,QString sex, QDate birthday, QString job, bool married)
{
    //插入字段姓名
    QTableWidgetItem *item = new QTableWidgetItem(name);
    ui->tableWidget->setItem(rwoIndex,0,item);
    item->setData(Qt::UserRole,QVariant(ID)); //添加附加数据,不在表格中显示

    //插入字段性别
    item = new QTableWidgetItem(sex);
    QIcon icon;
    if(sex == "male"){
        icon.addFile(":/images/boy.png");
    }else{
        icon.addFile(":/images/girl.png");
    }
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本居中显示
    ui->tableWidget->setItem(rwoIndex,1,item);

    item = new QTableWidgetItem(birthday.toString("yyyy-MM-dd"));
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->tableWidget->setItem(rwoIndex,2,item);

    item = new QTableWidgetItem(job);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->tableWidget->setItem(rwoIndex,3,item);

    item = new QTableWidgetItem(married ? "已婚":"未婚");
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->tableWidget->setItem(rwoIndex,4,item);
}


void MainWindow::on_actionInsert_triggered()
{
    int row = ui->tableWidget->currentRow();
    ui->tableWidget->insertRow(row);

    QStringList jobs = {"软件工程师","测试工程师","硬件工程师"};
    maxNumber++;
    CreateRow(row,
              "未知",
              maxNumber,
              "male",
              QDate(2000, 1,1),
              "未知",
              false);
}

void MainWindow::on_actionDelete_triggered()
{

    auto item = ui->tableWidget->currentItem();

    if(item->isSelected()){
        ui->tableWidget->removeRow(item->row());
    }

}

void MainWindow::on_pushButton_clicked()
{
    ui->tableWidget->clearSelection();

    QString key = ui->lineEdit->text().trimmed(); //去掉首位空格
    if(key.length() > 0){
        auto items = ui->tableWidget->findItems(key,Qt::MatchContains);
        for(auto it = items.constBegin(); it != items.constEnd();it++){
            (*it)->setSelected(true);
        }
    }
}

void MainWindow::on_tableWidget_cellClicked(int row, int column)
{
   QString info;
   auto item = ui->tableWidget->currentItem();
   for(int i = 0; i <ui->tableWidget->columnCount();i++)
   {
       info = info + ui->tableWidget->item(row,i)->text() + " ";
   }
   ui->labelShow->setText(info);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值