2014-06-13 116 views
0

我的應用程序很簡單,我有兩個按鈕,第一個按鈕其文本+,第二個文本-
然後,我想要點擊任何一個按鈕時,我會收到我點擊過的按鈕的文本。獲取按鈕的文字時,點擊任何一個按鈕

而下面是點擊任何一個按鈕時調用的方法。

void Widget::btns_clicked() 
{ 
     QPushButton *btn = dynamic_cast<QPushButton*>(sender()); 
     char _operator = btn->text(); 

     switch(_operator){ 
     case '+': 
      QMessageBox::information(this, "Status", "You have clicked on (+)"); 
      break; 
     case '-': 
      QMessageBox::information(this, "Status", "You have clicked on (-)"); 
      break; 
     } 
} 

但出現以下錯誤信息:
cannot convert from 'QString' to 'char'

我也有另一個小打聽
是有做任何其他簡單的方法: dynamic_cast<QPushButton*>(sender());

+1

'char'是一個字符。 'text()'返回一個字符串。 – chris

+0

@chris:謝謝,但是如何轉換。 –

+0

好吧,大概你想確保字符串是一個字符並抓住第一個字符。 – chris

回答

1

btn->文本()回報的QString,這不是一個原生的C++類,所以你必須首先轉換成的std :: string。如果你看一下的QString文檔(例如,通過Qt的助理),你會看到那裏toStdString()功能做到了這一點:我已經使用

std::string _operator = btn->text().toStdString(); 

此外,通知字符串而不是char,因爲您不能將字符串分配給char。但是,這是沒有問題的,因爲字符串就是字符元素的數組,因此,我們可以使用_operator [0]在開關:

switch(_operator[0]){ 
    case '+': 
... 

這將解決當前的問題,並因此結束了答案。一個建議:爲什麼不爲每個按鈕使用不同的插槽,以便您立即知道哪個按鈕已被點擊?

此外,你現在的代碼根本不需要切換。你可以打印這樣的信息:

QMessageBox::information(this, "Status", "You have clicked on (" + _operator + ")"); 

無論點擊哪個按鈕,你總能得到正確的信息。

+0

你的解釋很清楚,我現在明白了。非常感謝你。如果你知道,第二個問題呢? –

+0

正如我在回答中寫的,另一種方法是爲'+'和' - '按鈕創建兩個單獨的插槽,並將各個按鈕連接到它們;這樣,您不必立即投出任何東西,因爲您立即知道哪個按鈕已被點擊,因爲單擊該按鈕會觸發右側的插槽。我不知道任何簡化這個的其他選擇。 – KjMag

+0

謝謝,但我的意思是'dynamic_cast (sender());'是否有可能獲得發件人保存的數據而不使用'dynamic_cast'。例如'QPushButton * btn = sender();'。 **注意:**在我的問題中的代碼只是一個小例子來解釋我的問題,但它不是我使用的真實代碼。 –