在SLOT宏中使用QString作为argmuent

时间:2013-05-29 17:59:37

标签: qt qt4.8

是否可以在SLOT宏中用作参数QString? PS。我的意思是一个简单的解决方案..不像QMetaObject :: connectSlotsByName()。

2 个答案:

答案 0 :(得分:2)

不,您无法将QString传递给SLOT宏。但您可以将QString用于connect。另外connect无法QString,因此您必须将其转换为const char *。简单的例子是:

QString slotName = SLOT(clicked());
connect(ui->pushButton, SIGNAL(clicked()), qPrintable(slotName));

SLOT只是对传递的参数进行字符串化并将其与1

连接起来
# define SLOT(a)     qFlagLocation("1"#a QLOCATION)

如果您不想使用SLOT,可以编写如下代码:

QString slotName = QString::number(QSLOT_CODE) + "clicked()";

答案 1 :(得分:0)

这是我当前项目的原始代码。它解析像/ me customtext这样的聊天命令,并调用cmd_me(const QString& params);插槽。 要引入新命令,它足以使用void cmd _ *(const QString&)创建私有槽。签名。

这是代码:

void ConsoleController::onCommand( const QString& cmd )
    {
        if ( cmd.length() < 1 )
            return ;
        if ( cmd[0] != '/' )
            return ;

        const QMetaObject *meta = metaObject();

        int posParam = cmd.indexOf( ' ' );
        if ( posParam == -1 )
            posParam = cmd.length();
        const QString command = cmd.mid( 1, posParam - 1 ).toLower();
        const QString params = cmd.mid( posParam + 1 );
        const QString slotName = QString( "cmd_%1( const QString& )" ).arg( command );
        const QString normalizedSlotName = QMetaObject::normalizedSignature( slotName.toStdString().c_str() );

        for ( int i = 0; i < meta->methodCount(); i++ )
        {
            QMetaMethod method = meta->method( i );
            if ( method.methodType() != QMetaMethod::Slot )
                continue;

            const QString signature = method.signature();
            if ( normalizedSlotName == signature )
            {
                method.invoke( this, Q_ARG( QString, params ) );
                return ;
            }
        }

        log( QString( "Command \"%1\" not recognized, type /help to list all available commands" ).arg( command ) );
    }

您可以根据自己的需要制定想法并进行调整。