1.QMainWindow中常用的類
繼承于QMainWindow類,原因該類提供了QWidget沒有提供的成員函數。
菜單欄、工具欄、狀態欄、浮動窗口(鉚接部件)、核心部件
1.1 菜單欄 QMenuBar
? ? //創建菜單欄 QMenuBar ?最多只能有一個
? ? QMenuBar *mbar = menuBar();
? ? //將菜單欄放入窗口中
? ? this->setMenuBar(mbar);
? ? //往菜單欄里增加菜單
? ? QMenu *file = mbar->addMenu("文件");
? ? QMenu *edit = mbar->addMenu("編輯");
? ? //往菜單中增加菜單項
? ? file->addAction("新建");
? ? //增加分隔符
? ? file->addSeparator();
? ? file->addAction("打開");
1.2 工具欄 QToolBar
? //創建工具欄 QToolBar ?可以有多個
? ? QToolBar *tbar = new QToolBar(this);
? ? //將工具欄放入窗口中 ?設置停靠區域
? ? this->addToolBar(Qt::LeftToolBarArea,tbar);
? ? //后期設置 只允許左右停靠
? ? tbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
? ? //不允許浮動
? ? tbar->setFloatable(false);
? ? //往工具欄中增加工具項
? ? tbar->addAction("歡迎");
? ? //實例化一個按鈕
? ? QPushButton *btn = new QPushButton(this);
? ? btn->setText("編輯");
? ? //將按鈕放入工具欄中
? ? tbar->addWidget(btn);
1.3 狀態欄 QStatusBar
? ? //創建狀態欄 QStatusBar ?最多只能有一個
? ? QStatusBar *sbar = statusBar();
? ? //將狀態欄放入窗口中
? ? this->setStatusBar(sbar);
? ? //實例化一個標簽
? ? QLabel *lab = new QLabel("問題",this);
? ? //將標簽放入狀態欄中
? ? //sbar->addWidget(lab);//默認從左邊顯示
? ? sbar->addPermanentWidget(lab); //默認從右邊顯示
1.4 浮動窗口 QDockWidget
? ?//創建浮動窗口 ?QDockWidget 可以有多個
? ? QDockWidget *dock = new QDockWidget("浮動窗口",this);
? ? //將浮動窗口放入界面中
? ? this->addDockWidget(Qt::BottomDockWidgetArea,dock);
? ? //后期設置 只允許左右停靠
? ? dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
? ? //創建中心部件 ?最多只能有一個
? ? QTextEdit *text_edit = new QTextEdit(this);
? ? //將中心部件放入窗口中
? ? this->setCentralWidget(text_edit);
2.ui界面文件
1> ui界面文件是在項目工程文件的Forms文件夾下(XXX.ui)
2> ui界面上可以通過ui指針訪問到ui界面上的所有組件。
3.信號與槽
qt以引為傲的核心機制:對象樹、信號與槽、事件機制
1> 信號和槽是qt的核心機制之一,可以實現多個組件之間的通信。
2> 信號:信號函數。信號定義在類體的signals權限下,信號函數是一個不完整的函數,只需要聲明,不需要實現。
3> 槽:槽函數。槽定義在類體的slots權限下,槽函數是一個完整的函數,既要有聲明,也要有定義。該函數可以當成普通函數使用。
4> 任意一個組件都有系統提供的信號和槽。
3.1 帶有信號和槽的類體定義
signals: //信號權限,該權限下函數 都是信號
? ? void my_signal(); //只需要聲明 不需要實現
? ??
? ??
public slots: //槽函數權限 ?,該權限下函數 都是槽函數
? ? void my_slot(); //需要聲明 也要實現
3.2 信號和槽的連接方式
3.2.1
基于ui界面上的連接,在ui界面下的信號和槽區,將系統提供的信號和槽進行連接。
該連接,無需手動書寫信號函數、槽函數、連接函數
3.2.2
基于ui界面上的連接,在組件上,右擊轉到槽,選中要發射的信號,在槽函數中處理相關邏輯代碼。
該連接,無需手動書寫信號函數、連接函數
3.2.3
手動連接信號和槽,基于qt4版本的連接,該連接是不友好的連接。
需要使用connect連接函數進行連接,在QObject類中
[static] QMetaObject::Connection //函數的返回值類型 ?靜態成員函數
? ? QObject::connect( //函數名
? ? ? ? const QObject *sender, //發送者 組件的指針
? ? ? ? const char *signal, //發送的信號 信號的函數 應該用函數指針接收 不能用char *接收 所以需要使用宏函數轉換
? ? ? ? const QObject *receiver, //接受者 組件的指針
? ? ? ? const char *method, // 槽函數 應該用函數指針接收 不能用char *接收 所以需要使用宏函數轉換
? ? ? ? )信號宏函數 SIGNAL()
槽宏函數 SLOT()
3.2.4
手動連接信號和槽,基于qt5版本的連接,該連接就是友好的連接
需要使用connect連接函數進行連接,在QObject類中
[static] QMetaObject::Connection //函數返回值類 ?靜態函數
? ? QObject::connect( //函數名
? ? ? ? const QObject *sender, //信號的發送者 ?組件的指針
? ? ? ? PointerToMemberFunction signal, //信號函數 ?可以直接傳函數名 原因是函數指針接收
? ? ? ? const QObject *receiver, //信號的接收者 ?組件的指針
? ? ? ? PointerToMemberFunction method, //槽函數 可以直接傳函數名 原因是函數指針接收
? ? ? ? )
3.2.5
手動連接信號和功能函數,如果信號一旦被觸發,則自動執行功能函數中的內容。
功能函數:全局函數、lambda表達式
[static] QMetaObject::Connection?
? ? QObject::connect(
? ? ? ? const QObject *sender,?
? ? ? ? PointerToMemberFunction signal,?
? ? ? ? Functor functor//功能函數
? ? ? ? )
3.3 自定義的信號
自定義的信號,定義在signals權限下,是一個不完整的函數,只要聲明,不要實現。
自定義 的信號,需要手動觸發,使用emit關鍵字進行發射信號,如果自定義的信號一旦被發射,則會自動執行對應的槽函數處理
3.4 斷開連接
disconnect()和connect()函數的參數一樣
作業
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->btn1,SIGNAL(clicked()),this,SLOT(close()));connect(ui->logbtn,&QPushButton::clicked,this,&Widget::my_slot1);}Widget::~Widget()
{delete ui;
}void Widget::my_slot1()
{QString uname;QString pword;uname=ui->ed1->text();pword=ui->ed2->text();if(uname=="admin" && pword=="123456"){qDebug() << "登錄成功" ;this->close();}else{qDebug() << "登錄失敗";ui->ed2->clear();}}