2013-08-06 66 views
0

我有一個工作信號插槽機制,供用戶檢查和取消選中複選框。在插槽中傳遞QString

QWidget *w = new QWidget(this); 
w->setFixedSize(300,200); 
QVBoxLayout *vbox = new QVBoxLayout; 

foreach(QString filt, filters){ 
    QCheckBox *checkbox = new QCheckBox(filt, this); 
    checkbox->setChecked(true); 
    vbox->addWidget(checkbox); 

    connect(checkbox, SIGNAL(stateChanged(int)), this, SLOT(cbstate(int))); 

} 

w->setLayout(vbox); 
w->show(); 

void MainWindow::cbstate(int state){ 
    if(state == 0){ 
     //unchecked 
     QMessageBox::information(this, "blah", "You have unchecked this box"); 
    } 
    else if (state == 2){ 
     //checked 
     QMessageBox::information(this, "blah", "You have checked this box"); 
    } 
} 

我的問題的解釋很簡單,我需要將QString filt傳遞給cbstate功能。

我不知道該怎麼做?當我試圖將它添加到插槽時,它會拋出錯誤。

+0

你不能這樣做,因爲cbstate函數是插槽,它的信號是stateChanged(int),它只接受int類型的參數。 – Ramez

+0

啊,好吧,有沒有一種可以解釋的方式,我可以通過某種方式改變事物的傳遞方式? – sark9012

回答

2

cbstate插槽中,您可以使用QObject::sender()獲得filt。它會返回指向checkbox的指針。你可以從它得到filt

void MainWindow::cbstate(int state){ 
    QChecBox* checkBox = qobject_cast<QCheckBox*>(sender()); 
    QString filt = checkBox->text(); 
    ... 
} 
+0

完美地工作,我知道想做一些額外的閱讀,以瞭解你剛剛在那裏提供給我的東西。我正在調查QObject? – sark9012

+0

請參閱http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#sender – Ashot

1

你也可以使用Qt的QSignalMapper類,這在我看來是更簡便的使用QObject::sender()。文檔相當全面。

+0

+1。這是瞭解信號發射器的適當的,明確的,不錯的方式。 – andref