QT第二天
一、QMainWindow
QMainWindow是一個為用戶提供主窗口程序的類,包含一個菜單欄(menu bar)、多個工具欄(tool bars)、多個錨接部件(dock widgets 又稱為浮動窗口)、一個狀態(tài)欄(status bar)及一個中心部件(central widget),是許多應用程序的基礎,如文本編輯器,圖片編輯器等。
菜單欄最多只能有一個,工具欄可以有多個
狀態(tài)欄最多只能有一個,鉚接部件(浮動窗口)可以有多個
!!!可以有多個的有add,只能有一個的只有set!!!
1.1 菜單欄(最多只能有一個)
頭文件:#include
1.1.1創(chuàng)建菜單欄
//菜單欄創(chuàng)建 不需要要放在對象樹上,因為源碼已經(jīng)放在對象樹上了 QMenuBar * bar = menuBar(); //將菜單欄放入窗口中 setMenuBar(bar);1.1.2 創(chuàng)建菜單
//創(chuàng)建菜單 QMenu * fileMenu = bar->addMenu("文件"); QMenu * editMenu = bar->addMenu("編輯");1.1.3 創(chuàng)建菜單項
//創(chuàng)建菜單項 //fileMenu->addAction("新建"); //上面這樣也行,但是為了接一下,返回QAction類型 QAction * newAction = fileMenu->addAction("新建");1.1.4 添加分隔符
//添加分隔符 fileMenu->addSeparator(); //fileMenu->addAction("打開"); QAction * openAction =fileMenu->addAction("打開");1.2 工具欄(可以有多個)
頭文件:#include
1.2.1 工具欄
//工具欄可以有多個 QToolBar * toolBar = new QToolBar(this); addToolBar(Qt::LeftToolBarArea,toolBar);1.2.2 后期設置只允許左右停靠
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);1.2.3 設置浮動
//設置浮動 toolBar->setFloatable(false);1.2.4 設置移動
//設置移動 toolBar->setMovable(false);1.2.5工具欄中可以設置內容
//工具欄中可以設置內容 toolBar->addAction(newAction); //添加分割線 toolBar->addSeparator(); toolBar->addAction(openAction);1.2.6 工具欄中添加按鈕(控件)
//工具欄中添加按鈕(控件) QPushButton * btn = new QPushButton("aa",this); toolBar->addWidget(btn);1.3 狀態(tài)欄(最多一個)
頭文件:#include
QStatusBar * stBar = statusBar();//設置到窗口中setStatusBar(stBar);//放標簽控件QLabel * label = new QLabel("提示的信息",this);stBar->addWidget(label);QLabel * label2 = new QLabel("右側提示的信息",this);stBar->addPermanentWidget(label2);QLabel的頭文件:#include
1.4 鉚接部件(浮動窗口) (可以有多個)
QDockWidget * dockWidget = new QDockWidget("浮動",this); addDockWidget(Qt::BottomDockWidgetArea,dockWidget);//設置后期停靠區(qū)域,只允許上下 dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);//設置中心部件 QTextEdit * edit = new QTextEdit(this); setCentralWidget(edit);1.5 整體代碼和效果
#include "mainwindow.h" #include <QMenuBar> #include <QToolBar> #include <QDebug> #include <QPushButton> #include <QStatusBar> #include <QLabel> #include <QDockWidget> #include <QTextEdit>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//重置窗口的大小resize(600,400);/*************************一、菜單欄**************************///菜單欄 只能 最多有一個//菜單欄創(chuàng)建 不需要要放在對象樹上,因為源碼已經(jīng)放在對象樹上了QMenuBar * bar = menuBar();//將菜單欄放入窗口中setMenuBar(bar);//創(chuàng)建菜單QMenu * fileMenu = bar->addMenu("文件");QMenu * editMenu = bar->addMenu("編輯");//創(chuàng)建菜單項//fileMenu->addAction("新建");QAction * newAction = fileMenu->addAction("新建");//添加分隔符fileMenu->addSeparator();//fileMenu->addAction("打開");QAction * openAction =fileMenu->addAction("打開");/*************************二、工具欄**************************///工具欄 可以有多個QToolBar * toolBar = new QToolBar(this);addToolBar(Qt::LeftToolBarArea,toolBar);//后期設置 只允許 左右停靠toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);//設置浮動toolBar->setFloatable(false);//設置移動toolBar->setMovable(false);//工具欄中可以設置內容toolBar->addAction(newAction);//添加分割線toolBar->addSeparator();toolBar->addAction(openAction);//工具欄中添加按鈕(控件)QPushButton * btn = new QPushButton("aa",this);toolBar->addWidget(btn);/*************************三、狀態(tài)欄,最多有一個**************************/QStatusBar * stBar = statusBar();//設置到窗口中setStatusBar(stBar);//放標簽控件QLabel * label = new QLabel("提示的信息",this);stBar->addWidget(label);QLabel * label2 = new QLabel("右側提示的信息",this);stBar->addPermanentWidget(label2);/*************************四、鉚接部件(浮動窗口) 可以有多個**************************/QDockWidget * dockWidget = new QDockWidget("浮動",this);addDockWidget(Qt::BottomDockWidgetArea,dockWidget);//設置后期停靠區(qū)域,只允許上下dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);//設置中心部件QTextEdit * edit = new QTextEdit(this);setCentralWidget(edit);}MainWindow::~MainWindow() { }二、可視化設計
2.1 基本步驟
1.新建時勾選 generate from
2.點擊mainwindow.ui進入設計界面
3.菜單欄只能有一個,直接輸入名字就行
4.菜單項輸入的時候只能輸入英文,然后在text中修改成中文
5.添加鉚接(懸浮)部件
允許懸浮位置
6.添加核心部件
2.2 代碼
1.添加資源,右鍵到代碼所在的文件,把image復制到文件夾下
2.右鍵羨慕,點擊add new,添加Qt source
生成的res.qrc中 res為取的名字,qrc是Qt下面資源的后綴
3.open in edit
4.接著先添加前綴,再添加資源,把需要的圖片加入
5.代碼中設置
#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//ui->actionnew->setIcon(QIcon("C:/Users/lenovo/Desktop/資料-qt從入門到實戰(zhàn)/day2資料/Doc/Image/Luffy.png"));//使用添加Qt資源 ": + 前綴名 + 文件名"ui->actionnew->setIcon(QIcon(":/Image/Luffy.png"));ui->actionopen->setIcon(QIcon(":/Image/LuffyQ.png")); }MainWindow::~MainWindow() {delete ui; }三、對話框QDialog
3.1 分類
整體代碼:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDialog> #include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//點擊新建按鈕 彈出一個對話框connect(ui->actionnew,&QAction::triggered,[=](){//對話框 分類//模態(tài)對話框(不可以對其他窗口進行操作) 非模態(tài)對話框(可以對其他窗口進行操作)//1.模態(tài)創(chuàng)建 阻塞 // QDialog dlg(this); // dlg.resize(200,100); // dlg.exec(); // qDebug()<<"模態(tài)對話框彈出了";//2.非模態(tài)對話框/*2.1、為了窗口不會一閃而過,要創(chuàng)建在堆區(qū)2.2、因為放在對象樹中,只有整體窗口關閉,才會釋放,如果一直點會堆區(qū)內存泄漏*/QDialog * dlg2 = new QDialog(this);dlg2->resize(300,200);dlg2->show();//為了不內存泄漏dlg2->setAttribute(Qt::WA_DeleteOnClose); //55號屬性qDebug()<<"非模態(tài)對話框彈出了";}); }MainWindow::~MainWindow() {delete ui; }3.1.1 模態(tài)對話框 不可以對他窗口進行操作
QDialog dlg(this) dlg.exec(); //阻塞3.1.2 非模態(tài)對話框 可以對其他窗口進行操作
1.防止一閃而過
2.防止內存泄漏
//2.非模態(tài)對話框 /* 2.1、為了窗口不會一閃而過,要創(chuàng)建在堆區(qū) 2.2、因為放在對象樹中,只有整體窗口關閉,才會釋放,如果一直點會堆區(qū)內存泄漏*/ QDialog * dlg2 = new QDialog(this); dlg2->resize(300,200); dlg2->show(); //為了不內存泄漏 dlg2->setAttribute(Qt::WA_DeleteOnClose); //55號屬性 qDebug()<<"非模態(tài)對話框彈出了";3.2 標準對話框-信息對話框
QMessageBox靜態(tài)成員函數(shù) 創(chuàng)建對話框
3.2.1 錯誤對話框
//錯誤對話框 QMessageBox::critical(this,"critical","錯誤");3.2.2 信息對話框
//信息對話框 QMessageBox::information(this,"info","信息");3.2.3 提問對話框
//提問對話框 //參數(shù)1 父親、 參數(shù)2 標題 、參數(shù)3 提示內容 、參數(shù)4 按鍵類型、 參數(shù)5 默認關聯(lián)回車按鍵 QMessageBox::question(this,"quess","提問",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);如果想判斷是保存還是取消,可以這樣:
if(QMessageBox::Save==QMessageBox::question(this,"quess","提問",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel)) {qDebug()<<"選擇的是保存"; } else {qDebug()<<"選擇的是取消"; }3.2.4 警告對話框
//警告對話框 QMessageBox::warning(this,"warning","警告");3.3 標準對話框 - 顏色對話框
//顏色對話框 QColor color= QColorDialog::getColor(QColor(255,0,0)); qDebug()<<"r = "<<color.green()<<"b = "<<color.blue();3.4 標準對話框 - 文件對話框
//文件對話框 參數(shù)1 父親 參數(shù)2 標題 參數(shù)3 默認打開路徑 參數(shù)4 過濾文件格式 //返回值是選取的路徑 QString str = QFileDialog::getOpenFileName(this,"打開文件","C:/Users/lenovo/Desktop","(*.txt)"); qDebug()<<str;3.5 標準對話框 - 字體對話框
bool flag; QFont font = QFontDialog::getFont(&flag,QFont("華文彩云",36)); qDebug()<<"字體:"<<font.family().toUtf8().data()<<"字號:"<<font.pointSize()<<"是否加粗:"<<font.bold()<<"是否傾斜:"<<font.italic();四、布局管理器
4.1 實現(xiàn)登陸窗口
并且窗口固定了大小
4.2 利用布局方式 給窗口進行美化
如果不固定大小的時候,實現(xiàn)拖拽放大窗口的會自動跟隨者變
4.3 選取 widget 進行布局 ,水平布局、垂直布局、柵格布局
為了讓對齊使用柵格布局
4.4 給用戶名、密碼、登陸、退出按鈕進行布局
密碼設置為不明文形式,這樣設置
可視化里面設置固定大小,把最大最小設置一樣
4.5 默認窗口和控件之間 有9間隙,可以調整 layoutLeftMargin
4.6 利用彈簧進行布局
Horizontal Spacer
Vertical Spacer
如果不想一個widget的框太大,可以設置sizePolicy的垂直策略,設為固定值
五、控件
5.1 按鈕組
5.1.1 QPushButton 常用按鈕
5.1.2 QToolButton 工具按鈕 用于顯示圖片,如圖想顯示文字,修改風格:toolButtonStyle , 凸起風格autoRaise
(1)先根據(jù)二可視化設計中把資源加入,然后在Icon中添加資源,添加圖片,如果想要更改圖片的大小,可以點擊IconSize
(2)寫文字,但是為了顯示,下面的toolButtonStyle也要改成ToolButtonTextBesideIcon
把autoRaise點上,就能實現(xiàn)類似QQ點擊頭像那種功能
5.1.3 radioButton 單選按鈕,設置默認 ui->rBtnMan->setChecked(true); checkbox多選按鈕,監(jiān)聽狀態(tài),2 選中 1 半選 0 未選中
(1)單選按鈕,如果想分組,可以用Group Box
(2)結合代碼
首先:改名
寫代碼:
#include "widget.h" #include "ui_widget.h" #include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//設置單選的按鈕 男默認選中ui->rBtnMan->setChecked(true);//選中女后 打印信息connect(ui->rBtnWoman,&QRadioButton::clicked,this,[=](){qDebug()<<"選中了女";});}Widget::~Widget() {delete ui; }5.1.4 checkbox多選按鈕,監(jiān)聽狀態(tài),2 選中 1 半選 0 未選中
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QCheckBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//多選按鈕 2是選中 0是未選中 1是半選但是要把tristate勾上connect(ui->cBox,&QCheckBox::stateChanged,[=](int state){qDebug()<< state;});}Widget::~Widget() {delete ui; }5.2 QlistWidget 列表容器
5.2.1 QListWidget 一行內容
//利用listWidget寫詩 QListWidgetItem * item = new QListWidgetItem("鋤禾日當午"); //將一行詩放到listWidget控件中 ui->listWidget->addItem(item); //設置居中 item->setTextAlignment(Qt::AlignHCenter);5.2.2 可以利用addItems一次加入多行
//QStringList QList<string> QStringList list; list<<"鋤禾日當午"<<"汗滴禾下土"<<"誰知盤中餐"<<"粒粒皆辛苦"; ui->listWidget->addItems(list);5.2.3 補充:QStringlist
QStringList類提供字符串列表。
QStringList繼承自QList < QString >。與QList一樣,QStringList是隱式共享的。它提供了快速的基于索引的訪問,以及快速插入和刪除。將字符串列表作為值參數(shù)傳遞是快速和安全的。
5.3 QTreeWidget 樹控件
5.3.1 設置頭
首先在設計中添加 TreeWIdget,然后設置水平布局,默認的objectName為treeWidget
然后代碼控制:
(1)設置水平頭
//treeWidget樹控件的使用 //設置水平頭 ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介紹");QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");(2)加載頂層的節(jié)點
//加載頂層的節(jié)點 ui->treeWidget->addTopLevelItem(liItem);(3)追加子節(jié)點
//追加子節(jié)點 QStringList heroL1; heroL1<<"剛被豬"<<"前排坦克,能在吸收傷害的同時造成可觀的范圍輸出"; QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1); liItem->addChild(l1); QStringList heroL2; heroL2 << "船長" << "前排坦克,能肉能輸出能控場的全能英雄"; QTreeWidgetItem * l2 = new QTreeWidgetItem(heroL2); liItem->addChild(l2);整體代碼:
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//treeWidget樹控件的使用//設置水平頭ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介紹");QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList()<<"敏捷");QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList()<<"智力");//加載頂層的節(jié)點ui->treeWidget->addTopLevelItem(liItem);ui->treeWidget->addTopLevelItem(minItem);ui->treeWidget->addTopLevelItem(zhiItem);//追加子節(jié)點QStringList heroL1;heroL1<<"剛被豬"<<"前排坦克,能在吸收傷害的同時造成可觀的范圍輸出";QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);liItem->addChild(l1);QStringList heroL2;heroL2 << "船長" << "前排坦克,能肉能輸出能控場的全能英雄";QTreeWidgetItem * l2 = new QTreeWidgetItem(heroL2);liItem->addChild(l2);QStringList heroM1;heroM1 << "月騎" << "中排物理輸出,可以使用分裂利刃攻擊多個目標";QTreeWidgetItem * M1 = new QTreeWidgetItem(heroM1);minItem->addChild(M1);QStringList heroM2;heroM2 << "小魚人" << "前排戰(zhàn)士,擅長偷取敵人的屬性來增強自身戰(zhàn)力";QTreeWidgetItem * M2 = new QTreeWidgetItem(heroM2);minItem->addChild(M2);QStringList heroZ1;heroZ1 << "死靈法師" << "前排法師坦克,魔法抗性較高,擁有治療技能";QTreeWidgetItem * Z1 = new QTreeWidgetItem(heroZ1);zhiItem->addChild(Z1);QStringList heroZ2;heroZ2 << "巫醫(yī)" << "后排輔助法師,可以使用奇特的巫術詛咒敵人與治療隊友";QTreeWidgetItem * Z2 = new QTreeWidgetItem(heroZ2);zhiItem->addChild(Z2); }Widget::~Widget() {delete ui; }效果:
5.4 QTableWidget 控件
5.4.1 設置列數(shù)和設置行數(shù)
//設置列數(shù) ui->tableWidget->setColumnCount(3);//設置列數(shù) ui->tableWidget->setRowCount(4);5.4.2 設置表頭
//設置水平表頭 ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性別"<<"年齡");5.4.3 設置正文
方法一:
//設置正文 ui->tableWidget->setItem(0,0,new QTableWidgetItem("亞瑟"));方法二:
QStringList nameList; nameList<<"亞瑟"<<"趙云"<<"張飛"<<"關羽"<<"花木蘭"; //QList<QString> 等價于 QStringList QList<QString> sexList; sexList<<"男"<<"男"<<"男"<<"男"<<"女"; for(int i=0;i<5;i++) {int col = 0;ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));//也可以用中括號,越界直接掛了;用at越界會拋出異常ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));//int 轉 QStringui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18))); }5.4.4 補充:QStringList 和QList < string>
1.兩個效果一樣,使用方法
QStringList nameList; nameList<<"亞瑟"<<"趙云"<<"張飛"<<"關羽"<<"花木蘭"; //QList<QString> 等價于 QStringList QList<QString> sexList; sexList<<"男"<<"男"<<"男"<<"男"<<"女";2.用中括號,越界直接掛了;用at越界會拋出異常
QStringList nameList; nameList<<"亞瑟"<<"趙云"<<"張飛"<<"關羽"<<"花木蘭"; //QList<QString> 等價于 QStringList QList<QString> sexList; sexList<<"男"<<"男"<<"男"<<"男"<<"女"; for(int i=0;i<5;i++) {int col = 0;ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));//也可以用中括號,越界直接掛了;用at越界會拋出異常ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));//int 轉 QStringui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18))); }5.4.5 整體代碼
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//TableWidget控件//設置列數(shù)ui->tableWidget->setColumnCount(3);//設置水平表頭ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性別"<<"年齡");//設置列數(shù)ui->tableWidget->setRowCount(4);//設置正文 // ui->tableWidget->setItem(0,0,new QTableWidgetItem("亞瑟"));QStringList nameList;nameList<<"亞瑟"<<"趙云"<<"張飛"<<"關羽"<<"花木蘭";//QList<QString> 等價于 QStringListQList<QString> sexList;sexList<<"男"<<"男"<<"男"<<"男"<<"女";for(int i=0;i<5;i++){int col = 0;ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));//也可以用中括號,越界直接掛了;用at越界會拋出異常ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));//int 轉 QStringui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18)));}}Widget::~Widget() {delete ui; }5.5 其他控件
5.5.1 Scroll Area
比如在里面加很多的QPushbutton后,就會有一個滑動效果
5.5.2 Tool Box
類似于QQ的分組
5.5.3 Tab Box
類似于搜狗瀏覽器網(wǎng)頁切換的一個效果
5.3.4 Stacked Widget
可以通過小三角切換,顯示不同的,但是在運行的時候,三角不可見,得自己建按鈕控制,比如右邊三個
控制代碼:
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//棧控件使用//設置默認定位 scrollAreaui->stackedWidget->setCurrentIndex(1);//scrollArea 按鈕connect(ui->btn_scrollAreas,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(1);});//toolbox 按鈕connect(ui->btn_ToolBox,&QPushButton::clicked,[=]{ui->stackedWidget->setCurrentIndex(0);});//toolbox 按鈕connect(ui->btn_TableWidget,&QPushButton::clicked,[=]{ui->stackedWidget->setCurrentIndex(2);});}Widget::~Widget() {delete ui; }5.3.5 Combo BOx 下拉框
//下拉框 ui->comboBox->addItem("奔馳"); ui->comboBox->addItem("寶馬"); ui->comboBox->addItem("拖拉機");如果想用按鈕控制
//點擊按鈕選中拖拉機 選項 connect(ui->btn_select,&QPushButton::clicked,[=](){ui->comboBox->setCurrentIndex(2);//或者//ui->comboBox->setCurrentText("拖拉機"); });5.3.6 QLabel 顯示圖片和動圖
先添加圖片資源
//利用 QLable顯示圖片 ui->lb_Image->setPixmap(QPixmap(":/Image/butterfly.png"));//利用 QLabel 顯示動態(tài)圖 QMovie * movie = new QMovie(":/Image/mario.gif"); ui->lbl_Movie->setMovie(movie);//播放動圖 movie->start();,={
ui->stackedWidget->setCurrentIndex(1);
});
}
Widget::~Widget()
{
delete ui;
}
如果想用按鈕控制
//點擊按鈕選中拖拉機 選項 connect(ui->btn_select,&QPushButton::clicked,[=](){ui->comboBox->setCurrentIndex(2);//或者//ui->comboBox->setCurrentText("拖拉機"); });5.3.6 QLabel 顯示圖片和動圖
先添加圖片資源
//利用 QLable顯示圖片 ui->lb_Image->setPixmap(QPixmap(":/Image/butterfly.png"));//利用 QLabel 顯示動態(tài)圖 QMovie * movie = new QMovie(":/Image/mario.gif"); ui->lbl_Movie->setMovie(movie);//播放動圖 movie->start();總結
- 上一篇: 工作160:总结VUE几种页面刷新方法
- 下一篇: 前端学习(2602):什么是跨域请求和跨