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