{C++系列} Qt day02 信号和槽,容器窗口,面向对象的Qt编程,
in C/C++ with 0 comment

{C++系列} Qt day02 信号和槽,容器窗口,面向对象的Qt编程,

in C/C++ with 0 comment

回顾:
1 QT4.x.x QT5.x.x
2 QT程序开发流程
--》创建工程目录
--》编写源代码(C++)
--》qmake -project//xx.pro,QT+=widgets
--》qmake//Makefile
--》make/make clean
--》测试运行
3 字符编码QString
QTextCodec* coder =

QTextCodec::codecForName("当前编码方式");

QString str=coder->toUnicode("要转换的字符串")

==========================
今天:
一 信号和槽机制(重点)
1 概念
信号和槽是QT自己定义的一种通信机制,实现不同对象之间的交互,当一个对象状态发生改变时,将会发射信号,该信号可以被其它对象接收,接收信号的对象会执行一个指定函数(槽)。

2 定义
1)信号(特殊的成员函数)
class XXX:public QObject{

Q_OBJECT//moc编译器

signals:

void sig_func(...);//信号函数

};
注:信号函数只需声明不能写定义
2)槽(特殊的成员函数)
class XXX:public QObject{

Q_OBJECT//moc编译器

public slots:

void slot_func(...);//槽函数

};
3 信号和槽的连接
QObject::connect(

const QObject * sender, 
const char * signal, 
const QObject * receiver, 
const char * method);

@sender:信号发送对象
@signal:信号函数
@receiver:信号的接收对象
@method:要执行槽函数

SIGNAL(信号函数(参数表)):把信号函数转换成const char*字符串
SLOT(槽函数(参数表)):把信号函数转换成const char*字符串
eg:

   SIGNAL(clicked(void));
   SLOT(close(void));

《案例》创建一个qt应用,包含两个组件,一个标签还有一个按钮,当点击按钮组件时实现关闭标签的功能。

4 信号和槽连接时语法要求
1)信号函数和槽函数参数要一致
QObject::connect(A,SIGNAL(sigfun(int)),

        B,SLOT(slotfun(int)));//ok

2)可以带有缺省参数
QObject::connect(A,SIGNAL(sigfun(int)),

        B,SLOT(slotfun(int,int=0)));//ok

3)信号函数参数可以多于槽函数,多余参数将被忽略
QObject::connect(A,SIGNAL(sigfun(int,int)),

        B,SLOT(slotfun(int)));//ok

4)一个信号可以连接到多个槽函数:
QObject::connect(A,SIGNAL(sigfun(int)),

        B1,SLOT(slotfun1(int)));//ok

QObject::connect(A,SIGNAL(sigfun(int)),

        B2,SLOT(slotfun2(int)));//ok

注:当A发送信号时,两个槽函数都会被执行,执行顺序不确定。
5)多个信号可以连接到同一个槽函数
QObject::connect(A1,SIGNAL(sigfun1(int)),

        B,SLOT(slotfun(int)));//ok

QObject::connect(A2,SIGNAL(sigfun2(int)),

        B,SLOT(slotfun(int)));//ok

注:无论是A1或A2发送信号,B的槽函数都会被执行
6)两个信号可以直接连接(信号级联)//了解
QObject::connect(A1,SIGNAL(sigfun1(int)),

        A2,SIGNAL(sigfun2(int)));//ok

当A1发送信号时,A2也会随之发送信号。

二 容器窗口(父窗口)
1 父窗口可以停靠其它图形组件
如果一个组件在创建时指定其父窗口,那么就会停靠在父窗口上;如果不指定,就会飘在外面形成独立的窗体。

2 常用的父窗口类
QWidget
QMainWindow
QDialog
注:所有QWidget子类都可以作为父窗口,但是常用的父窗口类只有上面三个。
3 QWidget中两个常用的成员函数
1)调整大小
resize(int x,int y);
2)调整位置
move(int x,int y);
《案例》创建标签和按钮组件,并让其停靠在父窗口上,不再形成独立的窗体。

《案例》事件同步,滑块和选值框保持同步执行
1)QSlider滑块类
QSlider(QWidget* parent);
void setRange(int min,int max);//设置滑动范围
//滑块滑动时发送的信号
void valueChanged(int value)[signal]
//设置滑块位置的槽
void setValue(int value)[slot]

2)QSpinBox选值框
QSpinBox(QWidget* parent);
void setRange(int min,int max);//设置范围
//选值框值改变时发送的信号
void valueChanged(int value)[signal]
//设置选值框当前值的槽
void setValue(int value)[slot]

三 面向对象的qt编程
《案例》加法计算器
思路:
class CalculatorDialog:public QDialog{

Q_OBJECT //moc

public:

构造函数(){//初始化界面,信号和槽连接}

public slots:

使能等号按钮槽函数{
    检查左右操作数是否都为有效数字。
    是则使用等号按钮,否则禁用该按钮
}
计算结果的槽函数{
    获取输入的左右操作数,计算并显示
}

private:

QLineEdit
QPushButon
...

};
注:类的声明和定义要分开写
声明放到头文件(CalculatorDialog.h)
定义放在源程序中(CalculatorDialog.cpp)

Responses