-
1) 窗口组件(QWidget) -
2) QT坐标系统 -
3) 消息处理(信号与槽)
-
Qt以组件对象的方式构建图形用户界面 -
Qt中没有父组件的顶级组件,则被叫做窗口 -
组件的类型分为: -
容器类(父组件) : 用于包含功能的界面组件 -
功能类(子组件) : 用于实现特定的交互功能
-
QWidget能够绘制自己(因为继承了QPaintDevice类),也能够处理用户的输入,比如点击按钮 -
QWidget是Qt窗口组件类的父类 -
Qt中每个窗口组件都可以当做一个QWidget (因为子类可以初始化父类) -
QWidget类对象常作为父组件或顶级组件使用
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w; //创建QWidget类对象
w.show(); //显示QWidget类对象
return a.exec();
}
-
Qt使用统一的坐标系统定位窗口部件的位置和大小 -
QWidget类为组件类提供了窗口部件所需的坐标系统成员函数
-
顶级窗口部件的定位 : 父类的坐标位置 -
窗口内部件的定位 : 子类的坐标位置 -
窗口部件的大小设置 : 自己的坐标位置
-
resize() : 设置窗口内部的宽高( width()和height()值) -
move() : 设置整个窗口的x,y坐标( x()和y()值) -
setGeometry() : 设置窗口内部的x,y,w,h(不包括标题和窗口边框) -
size() : 获取窗口部件的大小 -
pos() : 获取窗口部件的位置 -
x() : 获取整个窗口x坐标 -
y() : 获取整个窗口y坐标 -
width() : 获取窗口内部的宽度(不包括外边框的宽度) -
height() : 获取窗口内部的高度(不包括窗口标题栏的高度) -
const QRect& geometry () : 获取窗口内部的x,y,w,h(不包括标题和窗口边框) -
const QRect& framgeometry () : 获取整个窗口的x,y,w,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();< span=""></w.x();<>
qDebug()<<"y()="<<w.y();< span=""></w.y();<>
qDebug()<<"width()="<<w.width();< span=""></w.width();<>
qDebug()<<"height()="<<w.height();< span=""></w.height();<>
qDebug()<<"QWidget::geometry()";
qDebug()<<"x="<<w.geometry().x();< span=""></w.geometry().x();<>
qDebug()<<"y="<<w.geometry().y();< span=""></w.geometry().y();<>
qDebug()<<"w="<<w.geometry().width();< span=""></w.geometry().width();<>
qDebug()<<"h="<<w.geometry().height();< span=""></w.geometry().height();<>
qDebug()<<"QWidget::frameGeometry()";
qDebug()<<"x="<<w.framegeometry().x();< span=""></w.framegeometry().x();<>
qDebug()<<"y="<<w.framegeometry().y();< span=""></w.framegeometry().y();<>
qDebug()<<"w="<<w.framegeometry().width();< span=""></w.framegeometry().width();<>
qDebug()<<"h="<<w.framegeometry().height();< span=""></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
-
由操作系统产生的消息,比如按键消息
-
程序中的消息处理函数,用来处理信号,比如处理按键点击信号
-
将系统信息绑定到信息处理函数(信号到槽的连接),通过connect()函数实现,且必须发生在两个Qt类对象之间,如下图所示:
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。
-
SIGNAL :指定消息名(信号),用于connect()函数里 -
SLOT : 指定消息处理函数名(槽),用于connect()函数里 -
Q_OBJECT : 指定该类拥有槽(消息处理),在类声明的内部开始处加上Q_OBJECT即可 -
slots : 用于在类中声明消息处理函数,比如:
private slots:
void buttonCliked();
初探信号与槽 通过点击按钮,使程序自动退出,代码如下所示:
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()都是系统预定义好的,接下来我们自定义槽 首先需要注意
-
类中声明槽(处理信号的成员函数)时,需要slots声明 -
槽和信号的函数参数必须一致,比如clicked()和quit()都是无参数的 -
SIGNAL和SLOT指定的函数(信号和槽)只能包含参数类型,不能包含参数名
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);
};
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(); //更据不同的按钮 打印不同信息
}
int main(int argc,char * argv[])
{
QApplication a(argc, argv);
QButtonDebug b(NULL,Qt::WindowCloseButtonHint);
// Qt::WindowCloseButtonHint:去掉标题按钮提示
return a.exec();
}
-
只有Qt类才能定义信号,且该类必须在头文件中声明 -
信号函数只能通过signals关键字进行声明,不能定义,且返回值必须是void类型 -
信号函数的属性会被自动设置为protected类型 -
发送信号时,只需要通过emit关键字调用信号函数即可 -
如果信号函数的参数多于槽函数时,多于的参数将被忽略 -
槽函数的返回值必须是void类型,且可以被其它普通成员函数调用
自定义信号示例:
class MySignal : public QObject
{
Q_OBJECT
signals: //自定义信号函数
void SendSignal(int i);
public:
void send(int i)
{
emit SendSignal(i); //调用信号函数,发送信号
}
};
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:"<<i;< span=""></i;<>
qDebug()<<endl;
}
};
-
信号函数可以连接多个槽函数 -
多个信号函数可以连接一个槽函数 -
一个信号就可以连接到另一个信号 -
通过connect函数进行连接,也可以通过disconnect函数取消连接
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
原文始发于微信公众号(汇编语言):2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论