Qt初学者使用(二)
用于技术分析和总结,充分发挥技术的白嫖,同时也是提升自己的写作水平,可以更好的看到自己缺点,同时如果有小伙伴们有什么不懂或者需要改善的,可以私下评论,我们一起共同进步,当前文章会持续的更新完善。
数据模型
QStandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据
QStringListModel 用于存储简单的QString列表
QDirModel 提供本地文件系统中的文件与目录信息
QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用来访问数据库
QListView
QStandardItemModel
QStringList dataList = {"Item 1", "Item 2", "Item 3","Item 4","Item 5","Item 6"};
QStringListModel *model = new QStringListModel(dataList);
ui->listView->setModel(model);
ui->listView->setSpacing(15); //为视图设置控件间距
//绑定选项的点击事件
connect(ui->listView,&QListView::clicked,this,[=](const QModelIndex &index){
qDebug() << "index" << index.data().toString(); //输出内容
qDebug() << "index" << index.row(); //输出索引
});
启用拖着功能
ui->listView->setDragEnabled(true); // 启用拖拽
ui->listView->viewport()->setAcceptDrops(true); // 接受拖放
ui->listView->setDropIndicatorShown(true); // 显示拖放指示器
ui->listView->setDragDropMode(QAbstractItemView::InternalMove); // 设置拖放模式
右键菜单
//打开右键菜单属性
ui->listView->setContextMenuPolicy(Qt::CustomContextMenu);
//响应右键菜单信号槽
connect(ui->listView,&QTreeView::customContextMenuRequested,this,[=](const QPoint &pos){
// 获取右键时 Qtableview 中的项
QModelIndex t_index = ui->listView->indexAt(pos);
if (t_index.isValid())
{
//右键菜单
QMenu current_menu(ui->listView);
current_menu.addAction("添加");
current_menu.addAction("删除");
connect(¤t_menu,&QMenu::triggered,this,[=](QAction * action){
qDebug() << "action " << action->text();
qDebug() << "节点内容 " << t_index.data().toString();
});
current_menu.exec(ui->listView->mapToGlobal(pos));
}
});
QTreeView
QStandardItemModel
QStandardItemModel *model = new QStandardItemModel();
// 假设我们添加一些数据
QStandardItem *rootNode = model->invisibleRootItem();
QStandardItem *parentItem = new QStandardItem("根节点1");
QStandardItem *parentItem2 = new QStandardItem("根节点2");
QStandardItem *childItem = new QStandardItem("子节点");
parentItem->appendRow(childItem);
rootNode->appendRow(parentItem);
rootNode->appendRow(parentItem2);
ui->treeView->setModel(model);
connect(ui->treeView, &QTreeView::clicked, this, [](const QModelIndex &index){
// 处理单击事件
qDebug() << "Clicked item:" << index.data().toString();
});
QFileSystemModel
文件系统浏览器,使用QTreeView和QFileSystemModel可以创建一个文件系统浏览器。
QFileSystemModel *fileSystemModel = new QFileSystemModel();
fileSystemModel->setRootPath(QDir::rootPath());
ui->treeView->setModel(fileSystemModel);
ui->treeView->setRootIndex(fileSystemModel->index(QDir::homePath()));
右键菜单
//打开右键菜单属性
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
//响应右键菜单信号槽
connect(ui->treeView,&QTreeView::customContextMenuRequested,this,[=](const QPoint &pos){
// 获取右键时 Qtableview 中的项
QModelIndex t_index = ui->treeView->indexAt(pos);
if (t_index.isValid())
{
//右键菜单
QMenu current_menu(ui->treeView);
current_menu.addAction("添加");
current_menu.addAction("删除");
connect(¤t_menu,&QMenu::triggered,this,[=](QAction * action){
qDebug() << "action " << action->text();
qDebug() << "节点内容 " << t_index.data().toString();
});
current_menu.exec(ui->treeView->mapToGlobal(pos));
}
});
QTableView
基础api
ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); // 固定表格宽度不可扩展,不可手动调整宽度
ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // 表格宽度随内容自动扩展
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 平分
ui->tableView->verticalHeader()->setDefaultSectionSize(30); //所有列的默认行高
ui->tableView->horizontalHeader()->setStretchLastSection(true); //将最后一列填充满表格
ui->tableView->horizontalHeader()->setVisible(false); // 隐藏水平表头
ui->tableView->verticalHeader()->hide(); //隐藏垂直表头
ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); // 设置水平表头为左对齐
ui->tableView->verticalHeader()->setDefaultAlignment(Qt::AlignBottom); // 设置垂直表头为底对齐
ui->tableView->verticalHeader()->setMinimumSectionSize(50); //设置选项的最小值
ui->tableView->setWordWrap(false); // 文本过长不换行
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置不可编辑
ui->tableView->setSelectionMode(QAbstractItemView::NoSelection); // 设置不可被选中
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); // 设置选中一整行
ui->tableView->setSelectionMode (QAbstractItemView::SingleSelection); // 只允许选中单行
//ui->tableView->setSelectionMode (QAbstractItemView::ExtendedSelection); // 允许选中多行
ui->tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // 显示垂直滑动条
ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏水平滑动条
ui->tableView->setVerticalScrollMode(QTableView::ScrollPerPixel); // 垂直滚动条设置为像素滚动
ui->tableView->verticalScrollBar()->setSingleStep(50/3); // 设置滚动条步长(要先设置为像素滚动,才能生效)
ui->tableView->setShowGrid(false); // 隐藏网格线
ui->tableView->setGridStyle(Qt::DotLine); // 线的样式
ui->tableView->setFocusPolicy(Qt::NoFocus); // 取消Item选中后的虚线边框
QStandardItemModel
QStandardItemModel* model = new QStandardItemModel();
ui->tableView->setModel(model);
ui->tableView->setFocusPolicy(Qt::NoFocus); //去掉选中单元格时的虚框
ui->tableView->horizontalHeader()->hide();
model->setHorizontalHeaderLabels({"", ""});
ui->tableView->verticalHeader()->setDefaultSectionSize(50); //设置默认高度
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 平分
model->setItem(0, 0, new QStandardItem("测试"));
QComboBox* cmb = new QComboBox();
cmb->addItems({"选择1", "选择2", "选择3", "选择4"});
ui->tableView->setIndexWidget(model->index(0, 1), cmb); //自定义选项
model->setItem(1, 0, new QStandardItem("测试"));
model->setItem(1, 1, new QStandardItem("测试"));
for (int i = 2;i < 10;i++)
{
model->setItem(i, 0, new QStandardItem("测试" + QString::number(i)));
model->setItem(i, 1, new QStandardItem("测试" + QString::number(i*10)));
}
QColumnView
添加数据
// 添加数据
QStandardItemModel * simpleModel = new QStandardItemModel();
QList<QStandardItem*> rootItems;
rootItems << new QStandardItem("分类 1") << new QStandardItem("分类 2") << new QStandardItem("分类 3");
simpleModel->appendColumn(rootItems);
QList<QStandardItem*> category1Items;
category1Items << new QStandardItem("子类 1.1") << new QStandardItem("子类 1.2") << new QStandardItem("子类 1.3");
rootItems[0]->appendColumn(category1Items);
QList<QStandardItem*> category2Items;
category2Items << new QStandardItem("子类 2.1") << new QStandardItem("子类 2.2") << new QStandardItem("子类 2.3");
rootItems[1]->appendColumn(category2Items);
QList<QStandardItem*> category3Items;
category3Items << new QStandardItem("子类 3.1") << new QStandardItem("子类 3.2") << new QStandardItem("子类 3.3");
rootItems[2]->appendColumn(category3Items);
QList<QStandardItem*> category3_1Items;
category3_1Items << new QStandardItem("子类 3.1.1") << new QStandardItem("子类 3.1.2") << new QStandardItem("子类 3.1.3");
category3Items[0]->appendColumn(category3_1Items);
ui->columnView->setModel(simpleModel);
ui->columnView->show();
使用文件系统模型
QFileSystemModel *fileSystemModel = new QFileSystemModel();
fileSystemModel->setRootPath(QDir::rootPath());
ui->columnView->setModel(fileSystemModel);
ui->columnView->show();