2013-05-29 13 views
1

是否可以在SLOT宏中用作參數QString? PS。我的意思是一個簡單的解決方案..不像在QMetaObject :: connectSlotsByName()。使用QString作爲SLOT宏中的參數

+1

我不這麼認爲; SLOT宏在編譯時定義其內容。你可以做一些像'QString slotName = SLOT(method());',然後將該字符串傳遞給'connect'? –

+0

不幸的是,沒有。我正在寫自動連接方法到我的班級,其中包含許多名稱前綴不同的函數 – Bleach

回答

2

不,你不能通過QStringSLOT宏。但是,您可以使用QString作爲connectconnect也不能採取QString,所以你必須將其轉換爲const char *。簡單的例子是:

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

SLOT只是stringifies傳遞的參數,並與1串連它:

# define SLOT(a)  qFlagLocation("1"#a QLOCATION) 

如果你不想使用SLOT有可能寫出這樣的代碼:

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

代碼: connect(pAct,SIGNAL(triggered()),this,SLOT(qPrintable(SlotActionPrefix + pAct-> objectName()) )); log: Object :: connect:無此插槽MainWindow :: qPrintable(pAct-> objectName())in。\ mainwindow.cpp:91 Object :: connect :(發件人名稱:'actionIPBlur') Object: :連接:(接收器名稱:'MainWindowClass') 不起作用( PS。QAction * pAct; const char * SlotActionPrefix =「act_」; – Bleach

+0

您不需要將'qPrintable'傳遞給'SLOT'宏。 – fasked

+0

謝謝,它的工作,我確實仔細閱讀) – Bleach

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)); 
    } 

你可以把一個想法,使其適用於您的需求。

+0

謝謝。索裏,但我無法提升你的業力 – Bleach

+0

沒有任何反應。你可能只接受一個答案。 –