Qt基础窗口类
我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二部让我们选择跟随项目创建的第一个窗口的基类,下拉菜单中有三个选项,分别是QMainWindow、QDialog、QWidget如下图:
QObject
- Qt中的对象类
QPaintDevice
- 绘图设备类
QWidget
- 所有窗口类的基类
- Qt中的控件(按钮、输入框、单选框…)也属于窗口,基类都是QWidget
- 可以内嵌到其他窗口中:没有边框
- 可以不内嵌单独显示:独立的窗口,有边框
QDialog
- 对话框类
- 不能内嵌到其他窗口中
QMainWindow
- 有工具栏、状态栏、菜单栏
- 不能内嵌到其他窗口中
QMainWindow菜单栏、工具栏和状态栏
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);
使用如上代码可以将窗口居中。
菜单栏
一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
//获取主窗口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);
主窗口自带QMenuBar对象,可以直接获取,当然我们也可以自定义QMenuBar对象,然后使用函数setMenuBar(),将自定义的对象添加到主窗口中,那么原来的对象就会被覆盖。需要我们自定义QMenu对象,QMenu对象中需要QAction对象(也就是我们的子菜单),然后将QAction对象的触发绑定到槽函数上。
QAction还可以创建快捷方式:
// 创建快捷方式:Ctrl+N,如果想自定义快捷键,可以设置为act->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
act1->setShortcuts(QKeySequence::New);
创建QAction对象的时候还可以指定图标:
QAction* act1=new QAction(QIcon("../Image/act1.png"),"SubMenu1",menu1);
工具栏
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);
工具栏中可以直接添加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);
使用QMainWindow进行布局
QMainWindow本身就有Layout,所以不能直接使用setLayout。否则会直接报错:
QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
从上面的图,我们就可以看出,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);
关于布局,我们在另外一篇文章中介绍。