qt QMetaObject::connectSlotsByName()自动关联失效问题解决
自己编写qt程序的时候,想使用qt on_objectName_signalName()命名规则自动关联信号和槽,老是发现失效。多方求解,答案事实上很简单就是没有理解objectName的含义。
on_objectName_signalName(signalParameters);仔细看好是objectName而不是变量名,一个控件的变量名和objectName是不同的。需要这样改:
pushButton = new QPushButton(tr("ok"));
pushButton->setObjectName("pushButtonObject");//在创建完控件后为其设定ObjectName(随便起名),在用这个name定义槽函数
//*****
//槽函数
on_pushButtonObject_clicked()
在qt uic自动生成的文件中setupUi()函数里有QMetaObject::connectSlotsByName(Xxx *xxx);有了就可以使用on_<objectname>_<signal name>(<signal parameters>)这种方式定义槽函数了,如果是使用.ui文件生成布局的话,uic会默认在setupUi里加上的。但是注意
a) 在自己写的程序中需要显式地调用QMetaObject::connectSlotsByName(Xxx *xxx),而且要卸载控件创建之后。
b) on_objectName_signalName(signalParameters);仔细看好是objectName而不是变量名,一个控件的变量名和objectName是不同的。所以应该在创建空间后紧跟着调用控件的setObjectName(QString)方法设置称要用的objectName。
c) 尽量使用connect()函数确定信号和槽关系。原因有二,由原码可知,connectSlotsByName函数最终也是调用了connect函数,在者请看下面这条。
d) 尽量不要把几个控件的objectName设置成一样的。这样的话connectSlotsByName函数只能为其中一个添加关联。
不懂可看下例:
//test.h
#ifndef TEST_H
#define TEST_H
#include <QtGui>
#include <QDialog>
//#include "ui_test.h"
class QPushButton;
class QLineEdit;
class Test : public QDialog
{
Q_OBJECT
public:
Test(QWidget *parent = 0);
~Test();
signals:
void Pushed();
public slots:
void on_pushButton_clicked();
void on_exitButton_clicked();
private:
QPushButton *pushButton;
QPushButton *exitButton;
QLineEdit *lineEdit;
};
#endif // TEST_H
//------------------------------------
//test.cpp
#include <QPushButton>
#include <QBoxLayout>
#include <QLineEdit>
#include <QWidget>
#include <qmessagebox.h>
#include "test.h"
Test::Test(QWidget *parent)
: QDialog(parent)
{
pushButton = new QPushButton(tr("ok"));
pushButton->setObjectName("pushButton");
exitButton = new QPushButton(tr("Cancel"));
exitButton->setObjectName("exitButton");
QVBoxLayout *layout= new QVBoxLayout;
layout->addWidget(pushButton);
layout->addWidget(exitButton);
this->setLayout(layout);
QMetaObject::connectSlotsByName(this);
}
Test::~Test()
{
delete pushButton;
delete exitButton;
}
void Test::on_pushButton_clicked(){
QMessageBox::information(this, "remind", "callback successful");
}
void Test::on_exitButton_clicked(){
QMessageBox::information(this, "mind", "exit successful");
}
//----------------------------------
//main.cpp
#include "test.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Test w;
w.show();
return a.exec();
}
本文参考http://www.cnblogs.com/ttylikl/archive/2009/07/13/1522770.html
qt QMetaObject::connectSlotsByName()自动关联失效问题解决的更多相关文章
- Qt 静态函数QMetaObject::connectSlotsByName(QObject * object)按命名规则自动connect,不需要手动connect
看别人代码看到void on_MyWidget_slotTest(); 就郁闷了,没看到他代码里有connect 却能把信号和槽可以连接起来. 今日回顾书本发现该函所的nb之处. QMetaObjec ...
- Qt 静态函数QMetaObject::connectSlotsByName(QObject * object)
看别人代码看到void on_MyWidget_slotTest(); 就郁闷了,没看到他代码里有connect 却能把信号和槽可以连接起来. 今日回顾书本发现该函所的nb之处. QMetaObjec ...
- QtCore.QMetaObject.connectSlotsByName:根据objectName和signal自动绑定slot
from PyQt5.QtWidgets import (QWidget , QVBoxLayout , QHBoxLayout, QLineEdit, QPushButton) from PyQt5 ...
- QMetaObject::connectSlotsByName: No matching signal for XXX 原理探究
问题引出: 在尝试实现<Qt5.9 c++开发指南>混合UI编程章节时,用纯代码形式实现了个小按钮,然后加了个对应的槽函数,运行时就提示了这个信息. 原因探究: 首先查阅官方手册中的说明: ...
- Qt 信号如何自动连接槽函数?
on_objectName_signal [static] void QMetaObject::connectSlotsByName(QObject *object) void on_<obje ...
- 【转】 Qt如何设置自动补全快捷键
原文:https://blog.csdn.net/u014597198/article/details/52797435 在用Qt编程的时,它默认是以“CTRL+空格”来作为自动补全的快捷键的,但是这 ...
- QT Creator 代码自动补全
QT Creator 代码自动补全 用QT Creater编程,如果没有自动补全是很痛苦的事情,于是便查阅了QT的文档,发现CTRL+SPACE是自 动补全的快捷键;但是在 Creater里使用居然没 ...
- Qt 中程序自动重启
参照至 dbzhang老师的博文,记录于此....... 要想理解重启,先得看看Qt程序怎么退出! 1.退出 int main(int argc, char** argv) { QApplicatio ...
- Qt仿win7自动顶部最大化左侧右侧半屏效果
Win7系统不得不说是非常好用的,也是目前为止占用份额最大的操作系统,其中win7有个效果,将窗体拖动到顶部时会自动最大化,拖动到左侧右侧时会自动半屏显示,再次拖动窗体到其他位置,会重新恢复之前的大小 ...
随机推荐
- 2016年12月17日 星期六 --出埃及记 Exodus 21:12
2016年12月17日 星期六 --出埃及记 Exodus 21:12 "Anyone who strikes a man and kills him shall surely be put ...
- JAVA线程同步辅助类Exchanger-交换
可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为 Synchro ...
- jQuery 添加元素
jQuery 添加元素 1.append 在被选元素的结尾插入内容 $(document).ready(function(){ $("button").click(function ...
- jQuery判断当前元素是第几个元素
$("ul li").click(function () { var index = $("ul li").index(this); alert(index); ...
- 史上最"恐怖"的12生肖图,绝对超猛
史上最“恐怖”的十二生肖图,绝对超猛!图片依次是:鼠 牛 虎 兔 龙 蛇 马 羊 猴 鸡 狗 猪!
- 使用celery之深入celery配置(转)
原文:http://www.dongwm.com/archives/shi-yong-celeryzhi-shen-ru-celerypei-zhi/ 前言 celery的官方文档其实相对还是写的很不 ...
- java高薪之路__005_IO流
参考地址: 1. http://blog.csdn.net/yczz/article/details/38761237 File类 ObjectInputStream && Objec ...
- Android handler 详解(面试百分之100问到)
handler在Android中被称为“消息处理者”,在多线程中比较常用. handler内部实现原理 handler实现机制:1,Message对象,表示要传递的一个消息,内部使用链表数据结构实现一 ...
- STM32学习笔记(四) RCC外设的学习和理解
RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识.但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的 ...
- JDK的安装与配置
1.什么是JDK(Java Development Kit) 开发工具,javac及基础核心类 运行环境,java及基础核心类 2.目前Java平台的版本 JavaSE(Java Platform S ...