做废塑料生意那个网站最专业,做网站必须有云虚拟主机,wordpress存放图片,wordpress标题间隔符修改对象模型
信号和槽
信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知#xff0c;槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击]#xff0c;它会发出一个信号[clicked()]#xff0c;然后与该对象连接的槽函数将被自动调用。 若某个信号与多…对象模型
信号和槽
信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击]它会发出一个信号[clicked()]然后与该对象连接的槽函数将被自动调用。 若某个信号与多个槽关联信号发射时槽的执行顺序为关联顺序
新建Widget项目mysignalslot 添加Qt设计师界面类模板Dialog without Buttons,类名MyDialog
//mydialog.h中signals:void dlgReturn(int); // 自定义的信号使用signals关键字 信号只需声明不用也不能定义只能是void 类的继承关系QObject-QWidget-QDialog-MyDialog
运行结果
connect()函数
函数原型
connect()函数的原型
QMetaObject::Connection QObject::connect
(const QObject *sender, const char *signal,
const QObject *receiver, const char *method,
Qt::ConnectionType type Qt::AutoConnection); sender发出信号的对象。 signal信号的名称是一个字符串包括信号名和参数类型列表。 receiver接收信号的对象。 method槽函数的名称是一个字符串包括槽函数名和参数类型列表。 type连接的类型默认为Qt::AutoConnection。 MyDialog *dlg new MyDialog(this);connect(dlg, SIGNAL(dlgReturn(int)), this, SLOT(showValue(int)));dlg-show();基于函数指针的重载形式
Qt5加入的基于函数指针的重载形式
QMetaObject::Connection QObject::connect
(const QObject *sender, PointerToMemberFunction signal,
const QObject *receiver, PointerToMemberFunction slot,
Qt::ConnectionType type Qt::AutoConnection);connect(dlg, MyDialog::dlgReturn, this, Widget::showValue);断开关联的disconnect()函数也有这两个形式参数相同缺省参数可用0占位
关联类型第5个参数
展开介绍connect()函数的关联类型第5个参数 假设有一个QPushButton对象button和一个MyClass对象myObj 其中MyClass定义了一个槽函数mySlot()。 connect(button, QPushButton::clicked, myObj, MyClass::mySlot, Qt::AutoConnection); Qt::AutoConnection自动连接 这是connect()函数的默认关联类型。当信号和槽函数运行在同一线程时使用直接连接方式否则使用队列连接方式。这种连接方式通常是最合适的。Qt::DirectConnection直接连接 当信号clicked()被触发时mySlot()将立即被调用无论是哪个线程发射该信号。如果是在非GUI线程中发射信号则槽函数也会在该线程中运行。如果是在GUI线程中发射信号则槽函数也会在GUI线程中运行。Qt::QueuedConnection队列连接 当信号clicked()被触发时mySlot()将被放入接收对象的事件队列中并在稍后的某个时刻被执行。这种连接方式保证了槽函数的执行发生在接收对象的线程中并且不会阻塞发送者。Qt::BlockingQueuedConnection阻塞队列连接 当信号clicked()被触发时mySlot()将被放入接收对象的事件队列中并阻塞发送者直到槽函数执行完毕。这种连接方式保证了槽函数的执行发生在接收对象的线程中但会阻塞发送者。Qt::UniqueConnection唯一连接 当信号clicked()被触发时如果已经有一个与该信号和槽函数匹配的连接存在则不会创建新的连接。如果没有则创建一个新的连接。这种连接方式保证了同一个信号和槽函数不会被重复连接避免了槽函数多次执行的问题。
自动关联
打开项目mysignalslot2
//widget.cpp的构造函数QPushButton *button new QPushButton(this); // 创建按钮button-setObjectName(myButton); // 指定按钮的对象名ui-setupUi(this); // 要在定义了部件以后再调用这个函数setupUi()函数使用了connectSlotsByName()函数而且需要指定对象名因此顺序如上面代码所示
运行结果点击按钮关闭窗口
属性系统
打开项目myproperty
Q_PROPERTY宏
class ClassName : public QObject
{Q_OBJECTQ_PROPERTY(type name READ name [WRITE name] [RESET name] [NOTIFY name] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL])...
}本项目中的使用 Q_PROPERTY(QString userName READ getUserName WRITE setUserNameNOTIFY userNameChanged) // 注册属性userName运行结果
对象树与拥有权
打开项目myownership
对象树当父对象被销毁时它的子对象也会自动被销毁无需手动管理。
对析构函数添加qDebug
运行结果关闭窗口qDebug显示如下 重定义父部件 MyButton *button2 new MyButton;MyButton *button3 new MyButton;QHBoxLayout *layout new QHBoxLayout;layout-addWidget(button2);layout-addWidget(button3);//到此三个部件都还不确定ownershipsetLayout(layout); // 在该窗口中使用布局管理器则重定义父部件为Widget窗口运行结果 Debug显示如下
元对象系统
moc 是 Meta-Object Compiler元对象编译器的缩写是 Qt 的一个工具用于处理带有 Qt 扩展的 C 代码特别是处理信号和槽。moc 读取特殊的头文件如 QObject、Q_OBJECT、Q_PROPERTY 等生成相应的 C 代码包括元对象代码、信号和槽的实现代码等。 若一个或多个类的声明中包含Q_OBJECT宏则另外创建一个C源文件
比如在刚刚的myownership项目生成的debug文件中可以找到moc开头的C源文件