QMainwindow窗口
- 菜單欄
- 在二級菜單中輸入中文的方法
- 給菜單欄添加相應的動作
- 使用QMenu類的API方法添加菜單項
- 分隔符也是QAction類
- 工具欄
- 添加工具欄
- 在狀態欄中添加控件
- 工具欄添加其他類型的工具
- 工具欄的屬性
- 添加多個工具欄
- 使用窗口添加
- 使用代碼添加
- 狀態欄
- 常用API
- 在狀態欄顯示信息和清空顯示的信息
- 停靠窗口 (Dock Widget)
- 簡單使用
- 屬性面板
- 添加控件
- 存在的問題
- 解決辦法
菜單欄
只能有一個, 位于窗口的最上方
關于頂級菜單可以直接在UI窗口中雙擊, 直接輸入文本信息即可, 對應子菜單項也可以通過先雙擊在輸入的方式完成添加, 但是這種方式不支持中文的輸入。
輸入文字,按回車確認。
能創建二級菜單欄
在二級菜單中輸入中文的方法
新建動作( action )
得到:
將剛剛創建的動作拖到相應的菜單列表中去:
效果:
給菜單欄添加相應的動作
其中,菜單欄對應的類為QAction
當用戶點擊了菜單欄中的某一個QAction時,triggered信號被發射出啦
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"
#include "QMessageBox"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->createprogect1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下創建項目";QMessageBox::information(this, "提示框","成功創建項目",QMessageBox::Ok,QMessageBox::Save);});connect(ui->open_action,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下打開項目";QMessageBox::information(this, "提示框","成功打開項目",QMessageBox::Ok,QMessageBox::Save);});}MainWindow::~MainWindow()
{delete ui;
}
使用QMenu類的API方法添加菜單項
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"
#include "QMessageBox"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QAction* a1;a1 = ui->menu->addAction("打開老項目");connect(a1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下打開項目";QMessageBox::information(this, "提示框","成功打開老項目",QMessageBox::Ok,QMessageBox::Save);});connect(ui->createprogect1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下創建項目";QMessageBox::information(this, "提示框","成功創建項目",QMessageBox::Ok,QMessageBox::Save);});connect(ui->open_action,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下打開項目";QMessageBox::information(this, "提示框","成功打開項目",QMessageBox::Ok,QMessageBox::Save);});
}MainWindow::~MainWindow()
{delete ui;
}
分隔符也是QAction類
工具欄
可以有多個, 默認提供了一個, 窗口的上下左右都可以停靠
添加工具欄
在狀態欄中添加控件
可以使用之前的方法,在狀態欄中添加QAction控件
- 新建action
將action拖到工具欄里面
添加信號和槽函數
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"
#include "QMessageBox"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QAction* a1;a1 = ui->menu->addAction("打開老項目");//菜單欄connect(a1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下打開項目";QMessageBox::information(this, "提示框","成功打開老項目",QMessageBox::Ok,QMessageBox::Save);});connect(ui->createprogect1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下創建項目";QMessageBox::information(this, "提示框","成功創建項目",QMessageBox::Ok,QMessageBox::Save);});connect(ui->open_action,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下打開項目";QMessageBox::information(this, "提示框","成功打開項目",QMessageBox::Ok,QMessageBox::Save);});//工具欄connect(ui->action_4,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下工具4";QMessageBox::information(this, "提示框","點擊了一下工具4",QMessageBox::Ok,QMessageBox::Save);});connect(ui->action_1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下工具1";QMessageBox::information(this, "提示框","點擊了一下工具1",QMessageBox::Ok,QMessageBox::Save);});
}MainWindow::~MainWindow()
{delete ui;
}
效果:
工具欄添加其他類型的工具
// 在QMainWindow窗口中添加工具欄
void QMainWindow::addToolBar(Qt::ToolBarArea area, QToolBar *toolbar);
void QMainWindow::addToolBar(QToolBar *toolbar);
QToolBar *QMainWindow::addToolBar(const QString &title);// 將Qt控件放到工具欄中
// 工具欄類: QToolBar
// 添加的對象只要是QWidget或者啟子類都可以被添加
QAction *QToolBar::addWidget(QWidget *widget);// 添加QAction對象
QAction *QToolBar::addAction(const QString &text);
QAction *QToolBar::addAction(const QIcon &icon, const QString &text);// 添加分隔線
QAction *QToolBar::addSeparator()
在工具欄中,添加其他組件,并發送信號,調用槽函數的方法
工具欄的屬性
看到了QToolBar的繼承關系
movable屬性值為True(并設置了上下左右都可以停靠)
設置圖標大小和設置顯示圖標還是文字
對應的函數為
添加多個工具欄
使用窗口添加
再將之前的QAction拖到右邊的工具欄里面去:
使用代碼添加
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"
#include "QMessageBox"
#include "QLineEdit"
#include "QPushButton"
#include "QLineEdit"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QAction* a1;QAction* a2;QAction* a4;//QPushButton* b1= new QPushButton(this);// b1->setText("搜索按鈕");// QLineEdit* e1 = new QLineEdit();a1 = ui->menu->addAction("打開老項目");//給工具欄添加單行輸入框ui->toolBar->addWidget(new QPushButton("搜索按鈕"));ui->toolBar->addWidget(new QLineEdit);a4 = ui->toolBar->addAction("工具4");//菜單欄connect(a1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下打開項目";QMessageBox::information(this, "提示框","成功打開老項目",QMessageBox::Ok,QMessageBox::Save);});connect(ui->createprogect1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下創建項目";QMessageBox::information(this, "提示框","成功創建項目",QMessageBox::Ok,QMessageBox::Save);});connect(ui->open_action,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下打開項目";QMessageBox::information(this, "提示框","成功打開項目",QMessageBox::Ok,QMessageBox::Save);});//工具欄connect(ui->action_4,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下工具4";QMessageBox::information(this, "提示框","點擊了一下工具4",QMessageBox::Ok,QMessageBox::Save);});connect(ui->action_1,&QAction::triggered,this,[=]{qDebug()<<"點擊了一下工具1";QMessageBox::information(this, "提示框","點擊了一下工具1",QMessageBox::Ok,QMessageBox::Save);});
// connect(a2,&QAction::triggered,this,[=]{
// qDebug()<<"請輸入搜索類容";
// QMessageBox::information(this, "提示框",
// "請輸入搜索類容",
// QMessageBox::Ok,
// QMessageBox::Save);
// });
// connect(b1,&QAction::triggered,this,[=]{
// qDebug()<<"請輸入搜索類容";
// QMessageBox::information(this, "提示框",
// "請輸入搜索類容",
// QMessageBox::Ok,
// QMessageBox::Save);
// });connect(a4,&QAction::triggered,this,[=]{qDebug()<<"點擊了工具4";QMessageBox::information(this, "提示框","點擊了工具4",QMessageBox::Ok,QMessageBox::Save);});//對于toolbar2的操作QAction* a5;a5 = ui->toolBar_2->addAction("新建項目");connect(a5,&QAction::triggered,this,[=]{qDebug()<<"點擊新建項目";QMessageBox::information(this, "提示框","點擊了新建項目",QMessageBox::Ok,QMessageBox::Save);});QPushButton *b5 = new QPushButton(this);b5->setText("^_^");//添加小控件ui->toolBar_2->addWidget(b5);connect(b5,&QPushButton::clicked,this,[=]{qDebug()<<"點擊了^_^";QMessageBox::information(this, "提示框","點擊了^_^",QMessageBox::Ok,QMessageBox::Save);});QLineEdit* l5 = new QLineEdit();//添加小控件ui->toolBar_2->addWidget(l5);connect(l5,&QLineEdit::editingFinished,this,[=]{qDebug()<<"完成輸入";QMessageBox::information(this, "提示框","完成了輸入",QMessageBox::Ok,QMessageBox::Save);});//下方的工具欄QToolBar* b6 = new QToolBar(this);QMainWindow::addToolBar(Qt::BottomToolBarArea,b6);QAction* a6;a6 = b6->addAction("新建項目");connect(a6,&QAction::triggered,this,[=]{qDebug()<<"點擊新建項目";QMessageBox::information(this, "提示框","點擊了新建項目",QMessageBox::Ok,QMessageBox::Save);});}MainWindow::~MainWindow()
{delete ui;
}
在下方添加了工具欄,并在工具欄中添加了QAction組件
在下方的工具欄中,添加非QAction的組件(我使用的是QPushButton)
//下方的工具欄QToolBar* b6 = new QToolBar(this);QMainWindow::addToolBar(Qt::BottomToolBarArea,b6);QAction* a6;a6 = b6->addAction("新建項目");connect(a6,&QAction::triggered,this,[=]{qDebug()<<"點擊新建項目";QMessageBox::information(this, "提示框","點擊了新建項目",QMessageBox::Ok,QMessageBox::Save);});QPushButton *pb6 = new QPushButton(this);pb6->setText("退出");//添加小控件b6->addWidget(pb6);connect(pb6,&QPushButton::clicked,this,[=]{qDebug()<<"點擊了退出";QMessageBox::information(this, "提示框","點擊了退出",QMessageBox::Ok,QMessageBox::Save);});
狀態欄
只能有一個, 位于窗口最下方
需要在狀態欄中添加某些控件, 顯示某些屬性, 使用最多的就是添加標簽 QLabel
常用API
// 類型: QStatusBar
void QStatusBar::addWidget(QWidget *widget, int stretch = 0);[slot] void QStatusBar::clearMessage();
[slot] void QStatusBar::showMessage(const QString &message, int timeout = 0);
狀態欄出現了:右邊的三角形灰色點點
在狀態欄中添加QLabel,并設置跳轉路徑
//狀態欄QLabel* l7 = new QLabel();l7->setText(QStringLiteral("<a style='color: red; text-decoration: none ;font-size:20px' href = https://www.baidu.com><u>百度</u>"));ui->statusBar->addWidget(l7);connect(l7,&QLabel::linkActivated,this,[=](QString url){qDebug()<<"點擊了狀態欄label";QMessageBox::information(this, "提示框","點擊了狀態欄label",QMessageBox::Ok,QMessageBox::Save);QDesktopServices::openUrl(QUrl(url));});
QLabel超鏈接
再添加一個pushbutton按鈕
//狀態欄QLabel* l7 = new QLabel();l7->setText(QStringLiteral("<a style='color: red; text-decoration: none ;font-size:20px' href = https://www.baidu.com><u>百度</u>"));ui->statusBar->addWidget(l7);connect(l7,&QLabel::linkActivated,this,[=](QString url){qDebug()<<"點擊了狀態欄label";QMessageBox::information(this, "提示框","點擊了狀態欄label",QMessageBox::Ok,QMessageBox::Save);QDesktopServices::openUrl(QUrl(url));});// 再添加按鈕QPushButton* button = new QPushButton("狀態欄的按鈕");ui->statusBar->addWidget(button);connect(button,&QPushButton::clicked,this,[=](){qDebug()<<"點擊了狀態欄label";QMessageBox::information(this, "提示框","點擊了狀態欄pushbutton",QMessageBox::Ok,QMessageBox::Save);});
在狀態欄顯示信息和清空顯示的信息
void MainWindow::on_pushButton_2_clicked()
{//在狀態欄顯示信息connect(ui->pushButton_2,&QPushButton::clicked,this,[=]{ui->statusBar->showMessage("在狀態欄顯示的信息------------",0);});}void MainWindow::on_pushButton_clicked()
{//清空狀態欄清空顯示的信息connect(ui->pushButton,&QPushButton::clicked,this,[=]{ui->statusBar->clearMessage();});
}
顯示信息
清空信息
在項目開發中,不建議狀元欄顯示信息和狀態欄控件一起使用(存在覆蓋的問題)
停靠窗口 (Dock Widget)
可以有多個, 默認沒有提供, 窗口的上下左右都可以停靠
停靠窗口可以通過鼠標拖動停靠到窗口的上、下、左、右,或者浮動在窗口上方
在非QMainWindow類型的窗口中添加了停靠窗口, 那么這個窗口是不能移動和浮動的。
浮動窗口在工具欄中, 直接將其拖拽到UI界面上即可。
簡單使用
屬性面板
可以在屬性面板里面改,也可以使用函數修改。
添加控件
t拖拽進去就行
然后調用信息窗口
void MainWindow::on_pushButton_3_clicked()
{connect(ui->pushButton_3,&QPushButton::clicked,this,[=]{QMessageBox::critical(ui->dockWidget, "標題", "內容", QMessageBox::Apply, QMessageBox::Reset);qDebug()<<"點擊了一下";});
}
存在的問題
點第一下:沒調用提示框
點第二下:
點第三下:
調用了兩下
點第4下:
調用了三下。。。。。
解決辦法
在點擊控件的槽函數里面直接調用messagebox就行,不要再connect一次。。。。
void MainWindow::on_pushButton_3_clicked()
{qDebug()<<"點擊了一下";
// connect(ui->pushButton_3,&QPushButton::clicked,this,[=]{
// //QMessageBox::critical(ui->dockWidget, "標題", "內容", QMessageBox::Apply, QMessageBox::Reset);
// QMessageBox::information(this, "提示框",
// "點擊了^_^",
// QMessageBox::Ok,
// QMessageBox::Save);
// qDebug()<<"調用了一次message";
// });QMessageBox::information(this, "提示框","點擊了一下浮動窗口中的控件",QMessageBox::Ok,QMessageBox::Save);
}