Qt 在插槽宏中使用QString作为参数

Qt 在插槽宏中使用QString作为参数,qt,qt4.8,Qt,Qt4.8,是否可以用作插槽宏中的参数QString? 注:我指的是一个简单的解决方案。。与QMetaObject::connectSlotsByName()不同。否您不能将QString传递到SLOT宏。但是您可以使用QString进行connect。另外,connect无法获取QString,因此必须将其转换为const char*。简单的例子是: QString slotName = SLOT(clicked()); connect(ui->pushButton, SIGNAL(clicked(

是否可以用作插槽宏中的参数QString?
注:我指的是一个简单的解决方案。。与QMetaObject::connectSlotsByName()不同。

否您不能将
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)
如果您不想使用
插槽
,可以这样编写代码:

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

这是我当前项目中的原始代码。它解析像/me customtext这样的聊天命令,并调用cmd_me(const QString¶ms);狭槽 要引入新命令,使用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 ) );
    }
void控制台控制器::onCommand(const QString&cmd)
{
if(cmd.length()<1)
返回;
如果(cmd[0]!='/'))
返回;
常量QMetaObject*meta=metaObject();
int posParam=cmd.indexOf(“”);
if(posParam==-1)
posParam=cmd.length();
const QString command=cmd.mid(1,posParam-1.toLower();
常量QString params=cmd.mid(posParam+1);
const QString slotName=QString(“cmd_%1(const QString&)”)).arg(命令);
常量QString normalizedSlotName=QMetaObject::normalizedSignature(slotName.tostString().c_str());
对于(inti=0;imethodCount();i++)
{
QMetaMethod=meta->method(i);
if(method.methodType()!=QMetaMethod::Slot)
继续;
const QString signature=method.signature();
if(normalizedSlotName==签名)
{
调用(this,Q_ARG(QString,params));
返回;
}
}
日志(QString(“命令\%1\”无法识别,键入/help以列出所有可用命令”).arg(命令));
}

你可以根据自己的需要采纳一个想法。

我不这么认为;SLOT宏在编译时定义其内容。您可以执行类似于
QString slotName=SLOT(method())的操作吗,然后将该字符串传递到
connect
?不幸的是,没有。我正在向我的类编写自动连接方法,其中包含许多名称前缀不同的函数:connect(pAct,SIGNAL(triggered()),this,SLOT(qPrintable(SlotActionPrefix+pAct->objectName());日志:Object::connect:在中没有这样的插槽MainWindow::qPrintable(pAct->objectName())。\MainWindow.cpp:91对象::connect:(发送方名称:'actionIPBlur')对象::connect:(接收方名称:'MainWindowClass')不起作用(PS.QAction*pAct;const char*SlotActionPrefix=“act\ux”;您不需要将
qPrintable
传递到
SLOT
宏。请仔细阅读答案。谢谢。对不起,但我无法提高您的业力