窗口部件:简称部件,是Qt 中建立用户界面的主要元素。像主窗口 、对话框 、标签 、还有以后要介绍到的按钮 、文本输入框等都是窗口部件 。
窗口:把没有嵌入到其他部件中的部件称为窗口,一般的,窗口都有边框和标题栏,就像程序中的widget和label一样 。
窗口就是没有父部件的部件,所以又称为顶级部件(top- - levelwidget )。
子部件:非窗口部件。在 Qt 中大部分部件被用作子部件,嵌入在别的窗口中 。
Qt Creator 提供的默认三个窗口基类:
QMainWindow:带有菜单栏和工具栏的主窗口类;
QDialog:是重要的信息显示和获取输入数据的用户界面对象,是各种对话框的基类;
QWidget:QWidget类是所有用户界面对象的基类,被称为基础窗口部件,继承自QObject 类和QPaintDevice类 。所有的窗口部件都继承自QWidget 。
QObject类是所有支持 Qt 对象模型 (t Qt t Object Model ) 的 Qt 对象的
的基类;
QPaintDevice 类是所有可以绘制的对象的基类
信号和槽用于两个对象之间的通信 ,是 信号和槽机制是Qt 的核心特
征 ,是 也是Qt 不同于其他开发框架的最突出的特征 。在 在GUI 编程中 ,
当改变了一个部件时 , 总希望其他部件也能了解到该变化 。
信号是一种特殊类型的成员函数。它们被定义为当某个事件发生
时就被发射 。
当对象内部发生某些事件时,它能够发出信号。如果这个信号连
接到槽,那么那个槽(函数)就被执行。可以将多个槽连接到同
一个信号,那么这些槽就将一个接一个地被执行,其执行顺序是
任意的。
**声明一个信号 , 例如:
signals:
void dlgReturn(int); // 自定义的信号
声明一个信号要使用signals 关键字 。
在 在signals 前面不能使用public 、private 和protected 等限定符 , 因为只有定义该
信号的类及其子类才可以发射该信号 。
信号只用声明 , 不需要也不能对它进行定义实现 。
信号没有返回值 , 只能是void 类型的 。
有 只有QObject 类及其子类派生的类才能使用信号和槽机制 , 使用信号和槽 , 还必
须在类声明的最开始处添加Q_OBJECT宏**
**发射信号:例如 :
void MyDialog::on_pushButton_clicked() // 确定按钮
{
int value = ui->spinBox->value(); // 获取输入的数值
emit dlgReturn(value); // 发射信号
close(); // 关闭对话框
}
当单击确定按钮时 ,取 便获取spinBox 部件中的数值 , 然后使用自定义的信
号将其作为参数发射出去 。用 发射一个信号要使用emit 关键字 , 例如程序中
发射了dlgReturn() 信号**
槽是标准的类成员函数,可以象调用其它函数一样调用它们。
信号和槽关联后,每当槽所连接的信号被发射时,槽(函数)就
被执行。
许多QT类已经包含一些程序中可以使用的预定义槽。
当编写Qt应用程序时,你会花费很多时间用于创建用户槽。当然,
也可以创建自己的信号,但是大多数情况下预定义信号已经足够
用。
自定义槽的声明:
private slots:
void showValue(int value);
实现:
void Widget::showValue(int value) // 自定义槽
{
ui->label->setText(tr(" 获取的值是:%1").arg(value));
}
用 声明一个槽需要使用slots 关键字 。是 一个槽可以是private 、public 或者protected 类型的 , 槽也可以
被声明为虚函数 , 这与普通的成员函数是一样的 , 也可以像调用一个普通函数一样来调用槽 。 槽的
最大特点就是可以和信号关联 。
public slots :在这个区内声明的槽意味着任何对象都可将信号与之相连接 。 这对于组件编程非常有用 ,
你可以创建彼此互不了解的对象 , 将它们的信号与槽进行连接以便信息能够正确的传递
信号/槽技术非常特殊。实际上,需要特殊的编程语句才能创建
信号和槽。因此C++编译器不能理解这些语句,因此,完成这两
项工作必须使用特殊的工具,即元对象编译器(meta object
complier,MOC)。这一工具扫描源文件中用于创建信号和槽的特殊语句,并将它生
成为有效的C++代码。
元对象编译器使用:
1、将自定义类声明放在头文件中,并在第一句加上宏Q_OBJECT
2、使用qmake工具生成makefile,则makefile会自动调用moc工
具对自定义信号和槽进行处理
在头文件中声明:
class Foo : public QObject
{
Q_OBJECT//诉编译器在编译之前必须先应用 moc 工具进行扩展
public:
Foo();
int value() const { return val; }
public slots:
void setValue( int );
signals:
void valueChanged( int );
private:
int val;
};
(1)connect()关联
connect() 函数原型如下:
bool QObject::connect ( const QObject * sender, const char *signal, const QObject * receiver, const char * method,Qt::ConnectionType type = Qt::AutoConnection )
参数:
1. 发送 信号的 对象;
2. 要 要 发送的 信号;
3. 接收信号的对象;
4. 要执行的槽 。
对于 信号和槽 ,用 必须使用SIGNAL() 和SLOT()宏 宏 , 它们可以将其
为 参数转化为const char 类型。 。connect() 函数的返回值为bool
类型 , 当关联成功时返回true。 。
信 号 和 槽 的 参 数 只 能 有 类 型 , 不 能 有 变 量 , 例 如 写 成
SLOT(showValue(int value)) 是不对的 。 对于信号和槽的参数
问题 , 基本原则是信号中的参数类型要和槽中的参数类型相对
应 , 而且信号中的参数可以多于槽中的参数 , 但是不能反过来 ,
如果信号中有多余的参数 , 那么它们将被忽略 。*
示例:
MyDialog *dlg = new MyDialog(this);
connect(dlg,SIGNAL(dlgReturn(int)),this,SLOT(showValue(int)));
发送 信号的 对象:dlg; ;
发送 的 信号:SIGNAL(dlgReturn(int)); ;
接收 信号的对象:this,表明是本部件,即Widget,当这个参数为this时 时 , 也可以将这个参数省略掉因为connect() 函数还有另外一
个重载形式 ,该参数默认为this; ;
要 执行的 槽:SLOT(showValue(int))。
添加新的设计师界面(UI界面)
在主窗口加入#include “mydialog.h”
右击登录,转到槽
自动生成代码,中间为自己添加
void Widget::on_OkpushButton_clicked()
{
myDialog *mydialog = new myDialog;//指针一定要初始化
mydialog->show();
}