是否可以在 SLOT 宏中用作参数 QString ?PS。我的意思是一个简单的解决方案.. 不像 QMetaObject::connectSlotsByName()。
问问题
274 次
2 回答
2
不,您不能传递QString
给SLOT
宏。但是你可以使用QString
for 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()";
于 2013-05-29T18:16:21.407 回答
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 ) );
}
您可以提出一个想法并根据您的需要进行调整。
于 2013-05-29T18:40:48.640 回答