自己编写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()自动关联失效问题解决的更多相关文章

  1. Qt 静态函数QMetaObject::connectSlotsByName(QObject * object)按命名规则自动connect,不需要手动connect

    看别人代码看到void on_MyWidget_slotTest(); 就郁闷了,没看到他代码里有connect 却能把信号和槽可以连接起来. 今日回顾书本发现该函所的nb之处. QMetaObjec ...

  2. Qt 静态函数QMetaObject::connectSlotsByName(QObject * object)

    看别人代码看到void on_MyWidget_slotTest(); 就郁闷了,没看到他代码里有connect 却能把信号和槽可以连接起来. 今日回顾书本发现该函所的nb之处. QMetaObjec ...

  3. QtCore.QMetaObject.connectSlotsByName:根据objectName和signal自动绑定slot

    from PyQt5.QtWidgets import (QWidget , QVBoxLayout , QHBoxLayout, QLineEdit, QPushButton) from PyQt5 ...

  4. QMetaObject::connectSlotsByName: No matching signal for XXX 原理探究

    问题引出: 在尝试实现<Qt5.9 c++开发指南>混合UI编程章节时,用纯代码形式实现了个小按钮,然后加了个对应的槽函数,运行时就提示了这个信息. 原因探究: 首先查阅官方手册中的说明: ...

  5. Qt 信号如何自动连接槽函数?

    on_objectName_signal [static] void QMetaObject::connectSlotsByName(QObject *object) void on_<obje ...

  6. 【转】 Qt如何设置自动补全快捷键

    原文:https://blog.csdn.net/u014597198/article/details/52797435 在用Qt编程的时,它默认是以“CTRL+空格”来作为自动补全的快捷键的,但是这 ...

  7. QT Creator 代码自动补全

    QT Creator 代码自动补全 用QT Creater编程,如果没有自动补全是很痛苦的事情,于是便查阅了QT的文档,发现CTRL+SPACE是自 动补全的快捷键;但是在 Creater里使用居然没 ...

  8. Qt 中程序自动重启

    参照至 dbzhang老师的博文,记录于此....... 要想理解重启,先得看看Qt程序怎么退出! 1.退出 int main(int argc, char** argv) { QApplicatio ...

  9. Qt仿win7自动顶部最大化左侧右侧半屏效果

    Win7系统不得不说是非常好用的,也是目前为止占用份额最大的操作系统,其中win7有个效果,将窗体拖动到顶部时会自动最大化,拖动到左侧右侧时会自动半屏显示,再次拖动窗体到其他位置,会重新恢复之前的大小 ...

随机推荐

  1. 轻量级IOC框架SwiftSuspenders

    该框架的1.6版本位于https://github.com/tschneidereit/SwiftSuspenders/blob/the-past/,现在已经出了重新架构的2.0版本,所以我决定先研究 ...

  2. Web网页的了解内容

    一.因特网(互联网) 1.发展阶段: A 实验科研阶段 B社会化应用启动阶段 C社会化应用阶段 2.基本特征:资源共享 二.万维网 1.全称全球信息网(World Wide web),简称Web 2. ...

  3. python学习之for语句

    1.range数字范围 for i in range(5): print (i) 结果显示: 0 1 2 3 4 2.列表显示 ']: print ("current num:", ...

  4. python 学习笔记九 队列,异步IO

    queue (队列) 队列是为线程安全使用的. 1.先入先出 import queue #测试定义类传入队列 class Foo(object): def __init__(self,n): self ...

  5. 分享 - 最初的JDBC操作步骤

    /* * 1. 注册 */ // 装载注册 SQLServer Driver Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDri ...

  6. C#读取XML文件中有乱码的处理办法

    1.以文本的方式读取出xml内容 2.如果xml加载文本失败,替换掉乱码的内容 private static void loadxml(XmlDocument doc, string str) { t ...

  7. 在mysql数据库原有字段后增加新内容

    update table set user=concat(user,$user) where xx=xxx; [注释]这个语法要求原来的字段值不能为null(可以为空字符''):

  8. Scrum Meeting 3-20151203

    任务安排 姓名 今日任务 明日任务 困难 董元财 请假(明天是编译截至最后一天) 学习上拉加入新的listview 无 胡亚坤 请假(明天是编译截至最后一天) 设计优化聊天页面 无 刘猛 请假(明天是 ...

  9. 笔记本_thinkpad_e440

    ZC: 这是我现在手上 公司工作的笔记本 1.进入 BIOS --> Enter键 2.背面信息 笔记本序列号(用于查找 驱动等) (ZC: 这个是 ThinkPad E440 的信息) 序号为 ...

  10. Android 控件知识点,

    一.Android控件具有visibility属性,可以取三个值:visible(默认值)可见,invisible(不可见,但仍然占据原有的位置和大小,可以看做是变得透明了),gone(空间不仅不可见 ...