本章主要内容以下: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