• Qt基础窗口类


    Qt基础窗口类

    我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二部让我们选择跟随项目创建的第一个窗口的基类,下拉菜单中有三个选项,分别是QMainWindow、QDialog、QWidget如下图:

    QObject
    QWidget
    QPaintDevice
    QDialog
    QMainWindow

    QObject

    1. Qt中的对象类

    QPaintDevice

    1. 绘图设备类

    QWidget

    1. 所有窗口类的基类
    2. Qt中的控件(按钮、输入框、单选框…)也属于窗口,基类都是QWidget
    3. 可以内嵌到其他窗口中:没有边框
    4. 可以不内嵌单独显示:独立的窗口,有边框

    QDialog

    1. 对话框类
    2. 不能内嵌到其他窗口中

    QMainWindow

    1. 有工具栏、状态栏、菜单栏
    2. 不能内嵌到其他窗口中

    QMainWindow菜单栏、工具栏和状态栏

    img

    QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)以及一个中心部件(central widget),是许多应用程序的基础。

        this->setWindowTitle("HapticChip");
        QDesktopWidget * desktop=QApplication::desktop();
        auto screen= desktop->screenNumber(this);
        QRect rect=desktop->screenGeometry(screen);
        this->move((rect.width()-this->width())/2,(rect.height()-this->height())/2);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用如上代码可以将窗口居中。

    菜单栏

    一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。

        //获取主窗口menuBar
        QMenuBar* menuBar= this->menuBar();
    
        //创建第一个菜单1
        QMenu* menu1=new QMenu("Menu1",menuBar);
        //创建子菜单1
        QAction* act1=new QAction("SubMenu1",menu1);
        //子菜单1触发时执行槽函数
        connect(act1,SIGNAL(triggered()),this,SLOT(subMenu1Action()));
        //在菜单1中添加子菜单1
        menu1->addAction(act1);
    
        //创建子菜单2
        QAction* act2=new QAction("SubMenu2",menu1);
        //子菜单2触发时执行槽函数
        connect(act2,SIGNAL(triggered()),this,SLOT(subMenu2Action()));
        //在菜单1中添加子菜单2
        menu1->addAction(act2);
    
        //将菜单1添加到menuBar
        menuBar->addMenu(menu1);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNteYZRJ-1663225686687)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220915110318579.png)]

    主窗口自带QMenuBar对象,可以直接获取,当然我们也可以自定义QMenuBar对象,然后使用函数setMenuBar(),将自定义的对象添加到主窗口中,那么原来的对象就会被覆盖。需要我们自定义QMenu对象,QMenu对象中需要QAction对象(也就是我们的子菜单),然后将QAction对象的触发绑定到槽函数上。

    QAction还可以创建快捷方式:

    // 创建快捷方式:Ctrl+N,如果想自定义快捷键,可以设置为act->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
    act1->setShortcuts(QKeySequence::New);
    
    • 1
    • 2

    创建QAction对象的时候还可以指定图标:

     QAction* act1=new QAction(QIcon("../Image/act1.png"),"SubMenu1",menu1);
    
    • 1
    工具栏
        QToolBar* toolBar=new QToolBar(this);
        toolBar->setAllowedAreas(Qt::TopToolBarArea);//设置工具栏的停靠区域
        toolBar->setMovable(false);//设置工具栏的可移动性
    
        //将Action对象添加到工具栏中
        QAction* act3=new QAction("Act3",toolBar);
        connect(act3,SIGNAL(triggered()),this,SLOT(subMenu1Action));
        toolBar->addAction(act3);
    
        //添加分割线到工具栏中
        toolBar->addSeparator();
    
        //将widget对象添加到工具栏中
        QPushButton* btn=new QPushButton("Btn",toolBar);
        toolBar->addWidget(btn);
    
        //将工具栏对象添加到主窗口中
        this->addToolBar(toolBar);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JS6lj7Wo-1663225686688)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220915113702848.png)]

    工具栏中可以直接添加QAction对象或者Widget。

    状态栏
        //获取主窗口的状态栏
        QStatusBar* statusBar= this->statusBar();
    
        //添加一个widget到状态栏中
        QLabel* label1= new QLabel();
        label1->setText("connect");
        statusBar->addWidget(label1);
        //添加一个widget到状态栏中
        QLabel* label2= new QLabel();
        label2->setText(tr("28.8"));
        statusBar->addWidget(label2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cucgkn3u-1663225686689)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220915142342409.png)]

    使用QMainWindow进行布局

    QMainWindow本身就有Layout,所以不能直接使用setLayout。否则会直接报错:

    QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
    
    • 1

    从上面的图,我们就可以看出,QMainWindow除了菜单栏、工具栏和状态栏外,还有一个很重要的组件叫CentralWidget,这个控件就是给我们用户自己添加控件的,所以我们后面的布局也是要在这个里面展开。

    例如:

    //创建一个widget设置为主窗体的CentralWidget
        mainWidget =new QWidget();
        this->setCentralWidget(mainWidget);
    
        //创建一个Layout,并把Layout添加到CentralWidget中
        layout=new QHBoxLayout();
        layout->setDirection(QBoxLayout::LeftToRight);
        layout->setMargin(5);
        this->centralWidget()->setLayout(layout);
    
        //在Layout中添加widget
        chipNameCB=new QComboBox();
        chipNameCB->addItem("SIA86917");
        chipNameCB->addItem("SIA86927");
        chipNameCB->addItem("SIH86917");
        chipNameCB->setCurrentIndex(0);
        layout->addWidget(chipNameCB,0);
    
        i2cAddrCB=new QComboBox();
        i2cAddrCB->addItem("0x5A");
        i2cAddrCB->addItem("0x5B");
        i2cAddrCB->setCurrentIndex(0);
        layout->addWidget(i2cAddrCB,0);
    
        connectPB=new QPushButton("Connect");
        layout->addWidget(connectPB,0);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r4sspwyw-1663225686689)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220915150637871.png)]

    关于布局,我们在另外一篇文章中介绍。

  • 相关阅读:
    华为机试 - 非严格递增连续数字序列
    土壤养分检测仪——可以分析土地健康状况的“田间民医”
    【JAVA】飞机大战
    C++&QT---QT-day3
    SpringBoot SpringCloud Nacos等一些组件版本对应
    为后续的PCBA生产更为顺畅,这篇盖/露PAD怎么选的文章不容错过
    Linux程序调试器——gdb的使用
    最短路问题
    第01章-Java语言概述
    Windows下x86和x64平台的Inline Hook介绍
  • 原文地址:https://blog.csdn.net/zhudaokuan/article/details/126872057