本章主要内容如下:
窗口组件(QWidget)
介绍
组件继承
Qt中所有窗口组件都继承于QWidget类,而QWidget类又继承于QObject类和QPaintDevice类.
QWidget组件介绍
初探QWidget
1)新建工程,选择Qt Gui应用,设置类信息:
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
2)生成QWidget模板
运行模板:
可以看到生成了一个窗口,然后我们来看看模板代码,是如何生成的.
3)模板代码如下所示
#include
#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类提供的常用坐标系统成员函数有:
可以参考下图所示(Window and Dialog Widgets)
注意: 在代码里,执行show()后, 再获取 x,y,w,h坐标 才有效
接下来我们通过3组不同的获取坐标函数,来打印(x,y,w,h)坐标信息
代码如下所示:
#include
#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()="<
运行打印:
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中定义了与系统信息相关的概念
信号(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
#include
#include
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
#include
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
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(sender()); //获取发送信号的对象 使用
qDebug()<< p_buton->text(); //更据不同的按钮 打印不同信息
}
写main.cpp
#include
#include
#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); //调用信号函数,发送信号
}
};
PS 信号如果要设为public,设置如下所示:
class MySignal : public QObject
{
Q_OBJECT
public:
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:"<objectName(); //打印发送对象名
qDebug()<<"Recv:"<
信号与槽的组合
示例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
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓