首先解释几个名词
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟主机、营销软件、网站建设、金湖网站维护、网站推广。事件:
Qt中的事件,主要指用户输入事件,比如:点击一个按钮、选中复选框、按下回车等。
事件处理:
当事件发生时,程序做出的反应,比如:当点击显示按钮时,程序弹出一个对话框,或产生其他相应。
信号和槽:
Qt中的事件处理机制叫做信号和槽 (signal & slot)
其理论模型为:
对象 a 中有一个信号signal:XXX(代表一个事件)
对象 b 中有一个槽slot:YYY(事件处理函数)
事先把它们连接起来, connect(a, XXX, b, YYY);
然后,当 a 中事件发生时,b中的处理函数就会被调用。
(每一种界面开发库都有一个事件处理机制,并且,事件处理总是脱离C++语法之外)
一、实现事件处理的过程:
1、查文档,找到相应事件产生的函数原型(或者说产生信号的函数signal)
2、声明、定义一个信号处理函数(槽),参数形式应该和signal的参数形式一致
3、将信号和槽用connect函数关联
前两步的示例如下:
//.h文件 private slots: int OnShowClicked(bool checked); //.cpp文件 int XXX::OnShowClicked(bool checked) { retunr 0; }
接下来做一个练习:
设计如下界面,并实现当点击按钮后,触发自己定义的事件,使下方的文本框显示一行内容
实现代码如下:
//.h class Test4_1a_11_29 : public QMainWindow { Q_OBJECT public: Test4_1a_11_29(QWidget *parent = Q_NULLPTR); private slots: int OnShowClicked(bool checked); private: Ui::Test4_1a_11_29Class ui; }; //.cpp Test4_1a_11_29::Test4_1a_11_29(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); connect(ui.btnShow, SIGNAL(clicked(bool)), this, SLOT(OnShowClicked(bool))); //connect的参数 : 对象QObject* A , A的信号(SIGNAL), 对象QObject* B , B的槽(SLOT) A为产生信号的对象, B为处理信号的对象 } int Test4_1a_11_29::OnShowClicked(bool checked) { ui.QPlainTextEdit1->setPlainText("change world"); return 0; }
二、connect的注意要点
响应函数(槽)要用slot关键字修饰
参数SIGNAL和SLOT函数都要大写
clicked和SLOT函数中的参数,注意只有类型
通过返回值判断connect()函数执行是否成功。
但我发现,只能用false判断,而不论connect() == true 还是 true == connect()的形式都是无法通过的,而如果非要用true,则需要对connect的返回值进行一次强制转换:
assert(true == (bool)connect(ui.btnShow, SIGNAL(clicked(bool)), this, SLOT(OnShowClicked(bool))));
原因待探查
尾巴:
检查connect的返回值,如果出错,可以用qDebug()函数打印调试信息,但用这种方法打印的提示信息只有在调试状态下可见。
既然这样,用assert()是不是更方便呢?
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。