Qt学习笔记(5)

目录

一.菜单栏(MenuBar)

二.工具栏(ToolBar)

三.状态栏(StatusBar)

四.浮动窗口(DockWidget)

五.右键菜单

六.托盘菜单


一.菜单栏(MenuBar)

  • 只能有一个, 创建的最上方

菜单栏有两种方式可以创建,一种获取系统提供的,一种是自己new一个,然后窗口setMenuBar为新建菜单:

    //获取提供的MenuBar
    QMenuBar* bar = menuBar();
    //自己new一个
    QMenuBar* selfBar = new QMenuBar(this);
    this->setMenuBar(selfBar);

菜单栏的操作一般是:添加菜单(Menu),添加菜单行为(Action),给菜单添加快捷键,连接信号与槽:

void MainWindow::initMenuBar()
{
    //获取提供的MenuBar
    QMenuBar* bar = menuBar();
    //自己new一个
    QMenuBar* selfBar = new QMenuBar(this);
    this->setMenuBar(selfBar);

    //给菜单栏添加菜单项,可以添加图标
    //给菜单添加快捷键,在写菜单文本时用&表示
    QMenu* fileMenu = selfBar->addMenu("文件(&F)");
    QMenu* editMenu = selfBar->addMenu("编辑(&D)");

    //给菜单添加动作,三种方式
    auto newfileAct = fileMenu->addAction("新建文件");
    auto openfileAct = fileMenu->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_FileIcon),"打开文件");

    auto saveAct = new QAction(style()->standardIcon(QStyle::StandardPixmap::SP_DirIcon),"保存文件");
    fileMenu->addAction(saveAct);

    //连接信号
    //1.复杂写法,每个写一遍,需要先接收一下返回值,直接连接动作信号
    connect(newfileAct,&QAction::triggered,this,[](){
        qDebug()<<"newfileAct";
    });
    connect(openfileAct,&QAction::triggered,this,[](){
        qDebug()<<"openfileAct";
    });
    connect(saveAct,&QAction::triggered,this,[](){
        qDebug()<<"saveAct";
    });
    //2.通过menu的信号处理动作的信号,可以捕获动作
    connect(fileMenu,&QMenu::triggered,this,[=](QAction* act){
        if(act == newfileAct)
        {

        }else if(act == openfileAct)
        {

        }else if(act == saveAct)
        {

        }
        qDebug()<<"triggered"<<act->text();
    });
    //3.直接在添加动作的时候添加处理函数,跟connect差不多
    fileMenu->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_MessageBoxWarning),"消息警告"
                        ,this,[](){qDebug()<<"消息警告";});

    //给动作添加快捷键,中间不能加空格
    newfileAct->setShortcut(QKeySequence("Ctrl+N"));
    openfileAct->setShortcut(QKeySequence("Ctrl+O"));

    //设置动作可以选中
    newfileAct->setCheckable(true);
}

二.工具栏(ToolBar)

  • 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠

工具栏一般是那种有图标的或者按钮:

void MainWindow::toolBar()
{
    //添加工具栏
    QToolBar* toolBar =  addToolBar("toolBar");
    //添加动作
    toolBar->addAction(QIcon(":/new/prefix1/phone.ico"),"电话");
    toolBar->addAction("hello");
    toolBar->addWidget(new QPushButton("按钮"));

    //可以有多个工具栏
    QToolBar* toolBar1 =  addToolBar("toolBar");
    //添加动作
    toolBar1->addAction(QIcon(":/new/prefix1/phone.ico"),"电话");
    toolBar1->addAction("hello");
    toolBar1->addWidget(new QPushButton("按钮"));
}

三.状态栏(StatusBar)

  • 只能有一个, 窗口最下方

同样的,有两种创建方式,一种是获取自带的状态栏,一种是new一个然后设置。

QStatusBar* statusbar = statusBar();
QStatusBar* statusbar = new QStatusBar;
this->setStatusBar(statusbar);

一般状态栏搭配Lable使用,文字放左边,按钮放右边,添加默认是左对齐,可以换。

void MainWindow::statusBar()
{
    //一般来说,showmessage左边,能点的放右边
    //获取自带的状态栏
    QStatusBar* bar = QMainWindow::statusBar();
    //添加控件,默认左对齐
    bar->addWidget(new QLabel("状态"));
    bar->addWidget(new QPushButton("AN状态"));

    //添加在右边的控件
    bar->addPermanentWidget(new QLabel("right"));
    auto show = new QPushButton("showMessage",this);
    bar->addPermanentWidget(show);
    connect(show,&QPushButton::clicked,this,[=](){
        //显示状态信息,参数2表示显示时长
        bar->showMessage("我在哦",2000);
    });
}

四.浮动窗口(DockWidget)

  • 也叫停靠窗口,可以有多个, 默认没有提供, 窗口的上下左右都可以停靠
void MainWindow::dockWidget()
{
    //创建浮动窗口
    QDockWidget* gitDock = new QDockWidget("Git");
    QDockWidget* solveDock = new QDockWidget("解决方案管理器");
    QDockWidget* teamDock = new QDockWidget("团队资源管理器");
    QDockWidget* resDock = new QDockWidget("资源视图");

    auto btn = new QPushButton("btn",gitDock);

    //把浮动窗口添加到mainwindow
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,gitDock);
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,solveDock);
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,teamDock);
    addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,resDock);

    //分割浮动窗口
    splitDockWidget(gitDock,solveDock,Qt::Orientation::Horizontal);
    //选项卡式停靠
    tabifyDockWidget(teamDock,resDock);
}

五.右键菜单

  • 在桌面右击鼠标会出现菜单,这个我们一般叫做右键菜单
  • 首先需要给控件设置上下文菜单策略 setContextMenuPolicy(Qt::CustomContextMenu) 
  • 设置该策略后当我们右键点击控件时qt会发送一个信号 customContextMenuRequested(const QPoint &pos) ,其中参数pos用来传递右键点击时的鼠标的坐标,这个坐标一般是相对于控件左上角而言的
  • 最后给这个信号设置相应的槽函数,在槽函数中将菜单展示出来就行了。
    //添加一个中心窗口
    this->setCentralWidget(new QTextEdit);

    //设置右键菜单策略
    setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
    contextMenu = new QMenu(this);
    contextMenu->addAction("a");
    contextMenu->addAction("b");
    //添加分割线
    contextMenu->addSeparator();
    contextMenu->addAction("c");
    contextMenu->addAction("d");
    //连接信号与槽
    connect(this,&MainWindow::customContextMenuRequested,this,[=](const QPoint& pos){
        //pos是相对屏幕的坐标
//        contextMenu->popup(pos);//弹出
        //需要相对坐标转为相对窗口的坐标
        //1.使用mapToParent
        contextMenu->popup(mapToParent(pos));
        //2.直接用全局
        contextMenu->popup(QCursor::pos());
        qDebug()<<"连接成功";
    });

六.托盘菜单

  • 系统托盘就是在系统桌面底部特定的区域显示运行的程序
void MainWindow::inittrayIcon()
{
    //创建,托盘一定要设置图标
    trayIcon = new QSystemTrayIcon(QIcon(":/new/prefix1/phone.ico"),this);
    //必须要手动显示
    trayIcon->show();
    //给托盘添加菜单
    QMenu* menu = new QMenu("我是一个菜单",this);
    menu->addAction("打开主面板",this,&MainWindow::showNormal);
    menu->addSeparator();
//    menu->addAction("退出程序",this,&MainWindow::close);//这种方式只适用于单窗口退出
    menu->addAction("退出程序",qApp,&QApplication::quit);//真正退出
    //把菜单交给托盘
    trayIcon->setContextMenu(menu);

    //处理托盘的信号
    connect(trayIcon,&QSystemTrayIcon::activated,this,&MainWindow::onActive);
}

void MainWindow::onActive(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason)
    {
    case QSystemTrayIcon::ActivationReason::Unknown:
        qDebug()<<"Unknown";
        break;
    case QSystemTrayIcon::ActivationReason::DoubleClick:
        qDebug()<<"DoubleClick";
        break;
    case QSystemTrayIcon::ActivationReason::Context:
        qDebug()<<"Context";
        break;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值