文章首发于我的个人博客:欢迎大佬们来逛逛
通过 **menuBar()**
来获得MainWindow唯一的菜单栏
继承自:QWidget
基本操作函数:
我们在添加Menu后还可以接着对Menu进行**嵌套操作。**比如对一个菜单项添加项目:addAction
我们可以指定很多对此菜单项的行为的操作:
例如直接对这个菜单项行为添加快捷键
// QMenu的addAction
QAction *addAction(const QIcon &icon, const QString &text)
QAction *addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
对于菜单条的addMenu可以直接使用 “文本(&E)”
的方式设置快捷键
信号:
槽函数:
void MainWindow::testMenuBar()
{
auto mainMenuBar=menuBar();
QMenu* fileMenu=mainMenuBar->addMenu("文件");
QMenu* pro=fileMenu->addMenu("项目");
pro->addAction("打开");
pro->addAction("保存",this,&MainWindow::on_Ctrl_S,QKeySequence("Ctrl+S"));
pro->addAction("新建");
fileMenu->addSeparator();
fileMenu->addAction("关闭");
fileMenu->addAction("视图");
QMenu* editMenu=mainMenuBar->addMenu("编辑(&E)");
connect(mainMenuBar,&QMenuBar::hovered,this,[=](QAction* act){
qInfo()<<act->text();
});
}
工具栏:可以有多个。
在一个工具栏上面可以添加很多控件
它继承自:QWidget
通过 addToolBar()
来获得工具栏。
基本操作函数:
在工具栏上添加很多控件以实现工具栏的效果:
void MainWindow::testToolBar()
{
auto mainToolBar=addToolBar("ToolBar1");
mainToolBar->addAction(style()->standardPixmap(QStyle::StandardPixmap::SP_ArrowRight),"前进");
mainToolBar->addAction(style()->standardPixmap(QStyle::StandardPixmap::SP_ArrowLeft),"后退");
mainToolBar->addSeparator();
auto chx=new QCheckBox("自动保存",this);
mainToolBar->addWidget(chx);
auto edit=new QLineEdit(this);
edit->setPlaceholderText("搜索内容");
mainToolBar->addWidget(edit);
auto btn=new QPushButton("搜索",this);
mainToolBar->addWidget(btn);
auto toolbtn=new QToolButton(this);
toolbtn->resize(150,150);
toolbtn->setText("返回桌面");
toolbtn->setIcon(style()->standardPixmap(QStyle::StandardPixmap::SP_DesktopIcon));
toolbtn->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextUnderIcon);
mainToolBar->addWidget(toolbtn);
}
状态栏:只能有唯一一个
表示这个窗口的状态。
它继承自:QWidget
使用 statusBar()
来获得窗口中唯一的状态栏控件。
基本操作函数:
信号:
槽函数:
我们可以使用 showMessage 来对状态栏显示某种信息:
void MainWindow::testStatusBar()
{
auto sBar=statusBar();
sBar->addWidget(new QLabel("准备就绪",this));
sBar->addWidget(new QPushButton("发射",this));
sBar->addPermanentWidget(new QLabel("完成",this));
}
...
void MainWindow::on_Ctrl_S()
{
//显示信息,持续两秒
statusBar()->showMessage("保存成功",2000);
}
浮动(可停靠)窗口:可以有多个
类似于 VS 中的窗口。
它继承自:QWidget
它表示一个浮动(可停靠)的窗口,可以拖动它的位置,或者固定它的位置。
注意:如果需要对这个窗口进行测试,必须首先设置一个中心区域:
setCentralWidget(new QPlainTextEdit(this));
因为只有设置了这个中心文本区域后,我们才能看到浮动窗口的正确的显示位置。
通过 addDockWidget()
来添加浮动窗口:在某个区域添加一个浮动窗口
void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
基本操作函数:
void MainWindow::testDockWidget()
{
//设置中心区域
setCentralWidget(new QPlainTextEdit(this));
auto DockWidget1=createDockWidget("解决方案资源管理器");
auto DockWidget2=createDockWidget("团队资源管理器");
auto DockWidget3=createDockWidget("命令窗口");
addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea,DockWidget1);
addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea,DockWidget2);
addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea,DockWidget3);
//设置浮动窗口的堆叠
tabifyDockWidget(DockWidget1,DockWidget2);
tabifyDockWidget(DockWidget2,DockWidget3);
}
系统的托盘图片:只能有唯一一个。
图中的 M 就是我的程序的图片。
通过QSystemTrayIcon 的构造函数来创建一个托盘图标,并且显示出来:
注意:必须传递一个图片和调用show(),否则不会显示。
auto trayIcon=new QSystemTrayIcon(QIcon(":/icon.png"),this);
trayIcon->show();
它继承自:QObject
基本操作函数:
信号:
槽函数:
我们为这个托盘图标设置了一个菜单,并且鼠标右键和双击都可以显示出来。
我们还在菜单中设置了一些行为:控制程序退出与窗口最小化切换。
void MainWindow::SystemTrayIcon()
{
auto trayIcon=new QSystemTrayIcon(QIcon(":/icon.png"),this);
trayIcon->show();
QMenu* trayMenu=new QMenu(this);
trayMenu->addAction("退出",qApp,[=](){
qApp->quit(); //退出系统
});
trayMenu->addSeparator();
trayMenu->addAction("最小化",this,[=](){
this->setVisible(!this->isVisible());
});
trayMenu->addAction("别点我",this,[=](){
//trayIcon->showMessage("警告,电脑即将爆炸","错误操作,爆炸倒计时!");
qInfo()<<"!!!!";
});
//添加上下文菜单
trayIcon->setContextMenu(trayMenu);
trayIcon->setToolTip("你好");
//处理激活原因
connect(trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason reason){
switch (reason) {
case QSystemTrayIcon::Unknown: //0
break;
case QSystemTrayIcon::Context: //1
break;
case QSystemTrayIcon::DoubleClick://2
//弹出菜单
trayIcon->contextMenu()->popup(QCursor::pos());
break;
case QSystemTrayIcon::Trigger: //左键点击
//窗口切换
this->setVisible(!this->isVisible());
break;
default:
break;
}
qInfo()<<reason;
});
}