zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2017-5-21 Asp.Net内置对象 和 DropDownList时间年月日的三级联动
    【2017-04--28】Winform中ListView控件
    【2017-04-27】布局及容器控件、打开多窗体、构造函数传值、打开唯一窗口
    【2017-04-25】winform公共控件、菜单和工具栏
    【2017-04-24】WinForm基础、登录窗口、窗口属性
    【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类
    【2017-04-18】Ado.Net C#连接数据库进行增、删、改、查
    【2017-04-17】类库、通用变量、is和as、委托
    【2017-04-16】抽象类、接口、构造函数、重载、静态成员和方法
    【面向对象】类、访问修饰符、封装、继承、多态
  • 原文地址:https://www.cnblogs.com/littleby/p/4873330.html
Copyright © 2011-2022 走看看