本章主要內容以下:app
窗口組件(QWidget)函數
介紹測試
以下圖所示:ui
好比上面的QgroupBox ,即屬於頂級組件的功能類(子組件),又是3個功能類組件的父組件(容器)this
組件繼承spa
Qt中全部窗口組件都繼承於QWidget類,而QWidget類又繼承於QObject類和QPaintDevice類.操作系統
以下圖所示(只舉例了3個窗口組件類):3d
QWidget組件介紹code
初探QWidget對象
1)新建工程,選擇Qt Gui應用,設置類信息:
2)生成QWidget模板
運行模板:
能夠看到生成了一個窗口,而後咱們來看看模板代碼,是如何生成的.
3)模板代碼以下所示
#include <QtGui/QApplication> #include "widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; //建立QWidget類對象 w.show(); //顯示QWidget類對象 return a.exec(); }
根據以前講的內容能夠發現,因爲上面的QWidget w對象沒有父組件,因此QWidget w便成爲了沒有父組件的頂級組件,從而生成了窗口.
Qt座標系統
介紹
在Qt裏,座標類型分爲
座標位置示意圖,以下所示
QWidget類提供的經常使用座標系統成員函數有:
能夠參考下圖所示
注意: 在代碼裏,執行show()後, 再獲取 x,y,w,h座標 纔有效
接下來咱們經過3組不一樣的獲取座標函數,來打印(x,y,w,h)座標信息
代碼以下所示:
#include <QtGui> #include "widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; QPushButton b("button",&w); //生成 QPushButton對象, 其父組件爲 QWidget
/*設置窗口大小位置*/ w.resize(200,300); w.move(300,300);
/*設置按鈕大小位置*/ b.resize(100,50); b.move(50,100); w.show();
qDebug()<<"QWidget:"; qDebug()<<"x()="<<w.x(); qDebug()<<"y()="<<w.y(); qDebug()<<"width()="<<w.width(); qDebug()<<"height()="<<w.height(); qDebug()<<"QWidget::geometry()"; qDebug()<<"x="<<w.geometry().x(); qDebug()<<"y="<<w.geometry().y(); qDebug()<<"w="<<w.geometry().width(); qDebug()<<"h="<<w.geometry().height(); qDebug()<<"QWidget::frameGeometry()"; qDebug()<<"x="<<w.frameGeometry().x(); qDebug()<<"y="<<w.frameGeometry().y(); qDebug()<<"w="<<w.frameGeometry().width(); qDebug()<<"h="<<w.frameGeometry().height(); return a.exec(); }
運行打印:
QWidget: x()= 300 y()= 300 width()= 200 height()= 300 QWidget::geometry() x= 308 y= 330 w= 200
h= 300 QWidget::frameGeometry() x= 300 y= 300 w= 216 h= 338
能夠看到,獲取的窗內座標(x,y)永遠比窗外座標大,窗外大小(w,h)永遠比窗內大小大
初探消息處理(信號與槽)
QT封裝了具體操做系統的消息機制,以下圖所示:
Qt中定義了與系統信息相關的概念
信號(signal)
槽(slot)
鏈接(Connect)
connect()函數原型
bool QObject::connect ( const QObject * sender, //發送對象 const char * signal, //消息名(信息) const QObject * receiver, //接收對象 const char * method, //接收對象的成員函數(槽) Qt::ConnectionType type = Qt::AutoConnection ) ; //正常狀況不須要設置 //當出現sender對象的signal信號,則會自動調用receiver對象的method
//鏈接成功,則返回true;不然返回false。
在信號與槽裏,Qt引進了幾個新的關鍵字:
private slots: void buttonCliked();
初探信號與槽
經過點擊按鈕,使程序自動退出,代碼以下所示:
#include <QtGui> #include <QApplication> #include <QPushButton> int main(int argc,char * argv[]) { QApplication app(argc,argv); QPushButton *quitButton = new QPushButton("Quit"); QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit())); //*quitButton(發送對象), &app(接收對象) //quit()做用是退出程序, QApplication的成員函數 //clicked()做用是鼠標點擊, 不少經常使用組件的成員函數 quitButton->show(); return app.exec(); }
其中上面的quit() 和clicked()都是系統預約義好的,接下來咱們自定義槽
首先須要注意
開始試驗,經過不一樣按鈕點擊,來打印不一樣的信息
寫QButtonDebug.h:
#ifndef QBUTTONDEBUG_H #define QBUTTONDEBUG_H
#include <QWidget> #include <QPushButton> class QButtonDebug : public QWidget { Q_OBJECT //指定該類擁有slots(槽) private: QPushButton *mbton1; QPushButton *mbton2; private slots: //經過slots 聲明 槽 void buttonCliked(); public: explicit QButtonDebug(QWidget *parent=0,Qt::WindowFlags f=0); }; #endif
寫QButtonDebug.cpp:
#include "QButtonDebug.h" #include <QDebug>
QButtonDebug:: QButtonDebug(QWidget *parent,Qt::WindowFlags f) : QWidget(parent,f) //顯示初始化父類 { mbton1 = new QPushButton("button1",this); mbton2 = new QPushButton("button2",this); /*設置按鈕座標*/ mbton1->resize(100,50); mbton1->move(50,50); mbton2->resize(100,50); mbton2->move(50,100); /*設置鏈接*/ QObject::connect(mbton1,SIGNAL(clicked()),this,SLOT(buttonCliked())); QObject::connect(mbton2,SIGNAL(clicked()),this,SLOT(buttonCliked())); QWidget::show(); }
void QButtonDebug:: buttonCliked() //消息處理函數 { QPushButton* p_buton =dynamic_cast<QPushButton*>(sender()); //獲取發送信號的對象 使用 qDebug()<< p_buton->text(); //更據不一樣的按鈕 打印不一樣信息 }
寫main.cpp
#include <QtGui> #include <QApplication> #include "QButtonDebug.h" int main(int argc,char * argv[]) { QApplication a(argc, argv); QButtonDebug b(NULL,Qt::WindowCloseButtonHint); // Qt::WindowCloseButtonHint:去掉標題按鈕提示 return a.exec(); }
運行測試
以下圖所示,能夠看到經過點擊不一樣的按鈕,便能打印不一樣的信息出來
深刻信號槽-自定義信號
介紹
自定義信號示例:
class MySignal : public QObject { Q_OBJECT signals: //自定義信號函數 void SendSignal(int i); public: void send(int i) { emit SendSignal(i); //調用信號函數,發送信號 } };
自定義槽函數示例:
class MySlot : public QObject { Q_OBJECT
protected slots: void RecvSlot(int i) { qDebug()<<"Send:"<<sender()->objectName(); //打印發送對象名 qDebug()<<"Recv:"<<i; qDebug()<<endl; } };
信號與槽的組合
示例1-多個信號鏈接一個槽:
MySignal s1; MySignal s2; MySlot t; s1.setObjectName("Signal1"); s2.setObjectName("Signal2");
QObject::connect(&s1,SIGNAL(SendSignal(int)),&t,SLOT(RecvSlot(int))); QObject::connect(&s2,SIGNAL(SendSignal(int)),&t,SLOT(RecvSlot(int))); s1.send(10); s2.send(12);
打印:
Send: "Signal1" Recv: 10 Send: "Signal2" Recv: 12
示例2-信號1鏈接信號2,信號2鏈接槽:
MySignal s1; MySignal s2; MySlot t; s1.setObjectName("Signal1"); s2.setObjectName("Signal2"); QObject::connect(&s1,SIGNAL(SendSignal(int)),&s2,SIGNAL(SendSignal(int))); QObject::connect(&s2,SIGNAL(SendSignal(int)),&t,SLOT(RecvSlot(int))); s1.send(10); s2.send(12);
打印:
Send: "Signal2" Recv: 10
Send: "Signal2" Recv: 12