2014-06-13 119 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();'。 **注意:**在我的问题中的代码只是一个小例子来解释我的问题,但它不是我使用的真实代码。 –