QT肝8天15--左侧静态菜单
本文介绍了Qt界面开发中的关键技术:1)Qt菜单导航的6种实现方法,包括主菜单栏、设计器创建、上下文菜单等功能;2)QTreeWidget控件详解,介绍其层级数据展示特性和性能优化建议;3)通过"阿迪达斯"项目案例,展示如何集成QTreeWidget实现左侧菜单导航系统,包含UI初始化、槽函数绑定等关键代码实现。文章最后提供了完整的MainWindow.cpp源码,实现了主窗口
1、Qt 菜单导航实现方法
方法一:使用 QMenuBar 和 QMenu
在 Qt 中,可以通过 QMenuBar 和 QMenu 类创建菜单导航。QMenuBar 通常作为主窗口的顶部菜单栏,而 QMenu 用于添加具体的菜单项。
方法二:使用 Qt Designer 设计菜单
在 Qt Designer 中,可以直接拖拽 Menu Bar 组件到主窗口,然后通过右键添加菜单和动作。这种方法更直观,适合快速原型开发。
- 在 Qt Designer 中打开主窗口
- 从左侧组件列表拖拽 Menu Bar 到窗口顶部
- 双击菜单栏输入菜单名称
- 右键点击菜单添加动作
方法三:上下文菜单实现
除了主菜单栏,还可以实现上下文菜单(右键菜单):
方法四:动态菜单更新
菜单项可以根据程序状态动态更新
方法五:菜单快捷键和图标
为菜单项添加快捷键和图标:
方法六:多级子菜单
创建多级菜单结构:
注意事项
- 保持菜单结构清晰,避免嵌套过深
- 为常用功能添加快捷键
- 考虑跨平台一致性
- 对于禁用状态的功能,相应菜单项也应禁用
- 大型应用建议使用 QActionGroup 管理相关动作
2、TreeWiget控件介绍
QT 中的 QTreeWidget
是一个用于显示树形结构数据的控件,继承自 QTreeView
,提供了更简单的接口来操作树形数据。它适合展示层级关系明确的内容,如文件目录、分类菜单等。
常用信号包括:
itemClicked(QTreeWidgetItem *item, int column)
:点击节点时触发。itemDoubleClicked(QTreeWidgetItem *item, int column)
:双击节点时触发。
常用操作
展开或折叠所有节点
性能优化
对于大量数据,建议使用 QTreeView
搭配模型(如 QFileSystemModel
或自定义模型)。QTreeWidget
适合数据量较小的场景,因其直接操作内存中的节点。
3、阿迪达斯,牛马行动
1、修改主界面UI
2、实现槽函数
3、静态左侧菜单
QTreeWidgetItem介绍
QTreeWidgetItem
是 Qt 框架中用于在 QTreeWidget
中显示树形结构数据的类。每个 QTreeWidgetItem
可以包含文本、图标、复选框等子项,并支持嵌套子节点。创建 QTreeWidgetItem
并添加到 QTreeWidget
中,QTreeWidgetItem
本身不直接提供信号,但可以通过 QTreeWidget
的信号(如 itemClicked
)处理交互:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QFile>
#include <subwin/customerform.h>
#include <subwin/orderform.h>
#include <subwin/peoplewin.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initUI();//初始化UI
//initPeopleList();//初始化列表
initMenuTreeList();
}
MainWindow::~MainWindow()
{
delete ui;
}
//初始化样式
void MainWindow::initUI()
{
// 设置图标
this->setWindowIcon(QIcon(":/img/zhaoxi.png"));
// 布局
Qt::WindowFlags flags = this->windowFlags();
flags |= Qt::FramelessWindowHint; // //隐藏标题栏
flags &= ~Qt::WindowMinMaxButtonsHint; // 隐藏最小最大化按钮
flags &= ~Qt::WindowCloseButtonHint; // 隐藏关闭按钮
this->setWindowFlags(flags);
// 读取样式表
QFile file(":/uistyle.css");
if (file.open(QFile::ReadOnly)) {
QString qss = QLatin1String(file.readAll());
file.close();
// 让读取的样式生效
this->setStyleSheet(qss);
}
//禁用左侧dockwidget状态
QWidget *w=new QWidget();
if(w){
ui->dockWidget_2->setTitleBarWidget(w);
}
}
//初始化列表
void MainWindow::initPeopleList()
{
PeopleWin *w=new PeopleWin();
if(w==nullptr){
return;
}
if(ui->rightcontentwidget->layout()==nullptr){
qDebug()<<"没有布局";
}
clearContainer(ui->rightcontentwidget);//清空布局内容
//重新创建布局进行填充
QGridLayout *layout=new QGridLayout(ui->rightcontentwidget);
if(layout==nullptr){
return;
}
layout->setSpacing(0);
layout->addWidget(w);//将人员列表窗体添加到布局中
ui->rightbuttonwidget->setSizePolicy(QSizePolicy::Policy::Expanding,QSizePolicy::Policy::Expanding);//设置策略
ui->rightbuttonwidget->setLayout(layout);//将布局添加到区域中
}
//清除内容区
void MainWindow::clearContainer(QWidget *container)
{
if(container){
QLayoutItem *child=nullptr;
QLayout *lay=ui->rightcontentwidget->layout();//获取内容区域的布局
if(lay){
while((child=lay->takeAt(0))!=0){
QWidget *w=child->widget();
if(w){
w->setParent(NULL);
w->deleteLater();
}
delete child;
}
delete lay;
container->setLayout(nullptr);
}
}
}
//关闭窗体
void MainWindow::on_closeToolButton_clicked()
{
int ret=QMessageBox::question(this,"关闭系统运行","您确定要退出系统吗?","确认","取消");
if(ret==0){
this->close();
}
}
//最大化窗体
void MainWindow::on_maxToolButton_clicked()
{
this->showFullScreen(); // 全屏展示
}
//最小化窗体
void MainWindow::on_minToolButton_clicked()
{
this->showMinimized();
}
//选择不同的菜单后触发的事件
void MainWindow::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
if(current==nullptr){
return;
}
//获取点击的菜单名称
QString name=current->text(0);//获取名称
if(name=="用户管理"){
initPeopleList();//初始化列表
}
else if(name=="客户管理"){
initCustomerList();
}else if(name=="订单管理"){
initOrderList();
}
}
//初始化客户窗体
void MainWindow::initCustomerList()
{
CustomerForm *w=new CustomerForm();
if(w==nullptr){
return;
}
if(ui->rightcontentwidget->layout()==nullptr){
qDebug()<<"没有布局";
}
clearContainer(ui->rightcontentwidget);//清空布局内容
//重新创建布局进行填充
QGridLayout *layout=new QGridLayout(ui->rightcontentwidget);
if(layout==nullptr){
return;
}
layout->setSpacing(0);
layout->addWidget(w);//将窗体添加到布局中
ui->rightbuttonwidget->setSizePolicy(QSizePolicy::Policy::Expanding,QSizePolicy::Policy::Expanding);//设置策略
ui->rightbuttonwidget->setLayout(layout);//将布局添加到区域中
}
//初始化客户窗体
void MainWindow::initOrderList()
{
OrderForm *w=new OrderForm();
if(w==nullptr){
return;
}
if(ui->rightcontentwidget->layout()==nullptr){
qDebug()<<"没有布局";
}
clearContainer(ui->rightcontentwidget);//清空布局内容
//重新创建布局进行填充
QGridLayout *layout=new QGridLayout(ui->rightcontentwidget);
if(layout==nullptr){
return;
}
layout->setSpacing(0);
layout->addWidget(w);//将窗体添加到布局中
ui->rightbuttonwidget->setSizePolicy(QSizePolicy::Policy::Expanding,QSizePolicy::Policy::Expanding);//设置策略
ui->rightbuttonwidget->setLayout(layout);//将布局添加到区域中
}
//初始化左侧菜单
void MainWindow::initMenuTreeList()
{
//创建根菜单
QStringList rootdata = {"系统管理", "001"};
QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->treeWidget, rootdata);
rootItem->setIcon(0, QIcon(":/img/sum.png"));
//创建子菜单
QStringList child1Data1 = {"用户管理", "001"};
QTreeWidgetItem *child1Item = new QTreeWidgetItem(rootItem, child1Data1);
child1Item->setIcon(0, QIcon(":/img/sum.png"));
QStringList rootdata2 = {"客户管理", "002"};
QTreeWidgetItem *rootItem2 = new QTreeWidgetItem(ui->treeWidget, rootdata2);
rootItem2->setIcon(0, QIcon(":/img/info.png"));
QStringList rootdata3 = {"订单管理", "003"};
QTreeWidgetItem *rootItem3 = new QTreeWidgetItem(ui->treeWidget, rootdata3);
rootItem3->setIcon(0, QIcon(":/img/alarm.png"));
ui->treeWidget->setHeaderHidden(true);
ui->treeWidget->setFocusPolicy(Qt::ClickFocus);
}
4、运行测试
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
更多推荐
所有评论(0)