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

时间: 2024-12-17 11:23:31

qt QMetaObject::connectSlotsByName()自动关联失效问题解决的相关文章

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

看别人代码看到void on_MyWidget_slotTest(); 就郁闷了,没看到他代码里有connect 却能把信号和槽可以连接起来. 今日回顾书本发现该函所的nb之处. QMetaObject::connectSlotsByName(QObject * object)将递归的搜寻传入的Qt对象object的所有子对象,并把所有匹配的子对象的信号关联到object对象的符合下列规则的槽函数void on_<窗口部件名称>_<信号名称>(<信号参数>) 如果窗口部

QMetaObject::connectSlotsByName 总结

<<总结之一> =================================================================================================== 查看Qt4的一些示例项目的时候,使用设计器打开其UI文件,在文件中竟然找不到signal和slot的连接.但是最终的程序,slot却又能准确的响应信号.打开通过ui文件自动生成的c++文件,其中也找不到connect语句,到底是怎么一回事? 经过逐语句的分析.终于发现连接的原

关于Qt MetaObject connectSlotsByName

QMetaObject::connectSlotsByName(QObject * object)将递归的搜寻传入的Qt对象object的所有子对象,并把所有匹配的子对象的信号关联到object对象的符合下列规则的槽函数void on_<窗口部件名称>_<信号名称>(<信号参数>) 注意: 1,设定父子关系,发送信号的对象必须是槽函数对象的子类,及函数参数 object的子类 2. 必须设置ObjectName, 变量名称不一定是对象名称(objectName) MyC

QT Creator 代码自动补全

QT Creator 代码自动补全 用QT Creater编程,如果没有自动补全是很痛苦的事情,于是便查阅了QT的文档,发现CTRL+SPACE是自 动补全的快捷键;但是在 Creater里使用居然没有效果,估计是输入法切换的冲突(CTRL+SPACE是我中英文输入的默认快捷 键)于是寻求解决方法,在QT Creater->Tools->Options... 里找到environment->Keyboard,发现 TextEditor.CompleteThis命令,其快捷键是Ctrl+S

【Qt编程】自动补全功能

最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行首字匹配,有时也会不方便.例如,如果我输入一个"好",如果是首字匹配的话会出现下图: 如果是句中匹配的话,则是这种情况: 你可以根据自己的要求进行选择哪一种模式. Qt中自带QCompleter类来实现上面的自动补全功能,读者可以在Qt自带的demo中很容易的学会该类的使用.下面我要讲的是

A20 sugar-standard 版本无法支持U盘自动挂载问题解决

前面硬件工程师在sugar-standard的基础上搞了个什么USB HUB的线路<我不是很明白>,但是这个时候的sugar-standard 依然能自动挂载U盘. 后面他又把USB接口的东西给弄成了 A20 sugar-cubieboard 2 的版本,于是这个时候原来的img烧进去,U口就没有任何反应,只有一个口能使用鼠标. 经过查资料得知:android系统自动挂载U盘,与一个叫 vold.fstab的文件有关. 于是在公司自己的源码  android/ 目录下   find ./ -n

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

on_objectName_signal [static] void QMetaObject::connectSlotsByName(QObject *object) void on_<object name>_<signal name>(<signal parameters>); eg. void on_button1_clicked(); QMetaObject::connectSlotsByName(this); 执行上面一个语句就会去连接 this 对象中的信号

Qt 中程序自动重启

参照至 dbzhang老师的博文,记录于此....... 要想理解重启,先得看看Qt程序怎么退出! 1.退出 [cpp] view plain copy int main(int argc, char** argv) { QApplication a(argc, argv); Widget w; w.show() return a.exec(); } 最后一句启动了主线程的事件循环.而要退出程序,就是要退出这个事件循环,使main函数返回. 如何退出? 正确方式: [cpp] view plai

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

Win7系统不得不说是非常好用的,也是目前为止占用份额最大的操作系统,其中win7有个效果,将窗体拖动到顶部时会自动最大化,拖动到左侧右侧时会自动半屏显示,再次拖动窗体到其他位置,会重新恢复之前的大小,这个效果还是比较人性化的,大大方便了很多用户的操作习惯. 在Qt中,如果是无边框窗体,(有边框窗体和操作系统窗体效果一致)并没有相关的API接口来实现这个效果,必须自己写代码来模拟这个效果,原理很简单,绑定事件过滤器,自动计算当前无边框窗体的位置和鼠标按下去的坐标,当到达顶部或者左侧右侧时,自动设