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

  • 相关阅读:
    Global.asax 文件是什么
    C和C++语言学习总结
    iphone窗口传值
    c语言实现队列
    iphone窗口跳转
    NSStirng、NSArray、 文件 以及枚举(Method小集合)
    服务器接受的链接过多,该怎么处理
    c语言实现单链表
    iphone开发 NSXMLParser解析xml文件
    iphone 切换界面
  • 原文地址:https://www.cnblogs.com/littleby/p/4873330.html
Copyright © 2011-2022 走看看