2011-12-09 53 views
1

我想在此添加一個新行。這是我的示例代碼:如何在Qt中追加這個?

ui->button->setText(" Tips " + "\n" + TipsCount); 

這是它顯示了錯誤:

類型的無效操作數的常量字符[7]'和 '爲const char [2]' 爲二進制 '運算符+'

但是當我添加標籤它會被追加!

ui->label->setText(name + "\n" + City); 

有人能幫我嗎?

回答

5

這是C++中的一個非常常見的問題(通常不僅僅是QT)。

感謝操作符重載的魔力,name + "\n"變成了一個方法調用(無法說出哪一個,因爲你沒有列出類型)。換句話說,因爲這兩件事中的一件是+重載的對象。

但是,當你嘗試做"abc" + "de",它爆炸了。原因是因爲編譯器試圖將兩個數組一起添加。它不理解你的意思是串聯,並試圖把它當作算術運算。

要更正此問題,請將字符串文字包裝爲適當的字符串對象類型(最有可能爲std::stringQString)。

+0

謝謝您的回答!巴特它工作正常!!! :) ui-> button-> setText(QString(「Tips」)+「\ n」+ TipsCount); – Naufal

+0

@Naufal我已經刪除了我的答案。這個人在解釋「爲什麼」方面做得更好。如果這回答你的問題(我認爲它的確如此),那麼你可以接受它作爲答案。 – Bart

+0

嗨巴特,我在按鈕中獲取文本在中心,我可以對齊按鈕的底部..有沒有任何財產或代碼要加? – Naufal

2

這裏是一個小案例:

QString h = "Hello";    // works 
QString w = "World";    // works too, of course 

QString a = h + "World";   // works 
QString b = "Hello" + w;   // also works 

QString c = "Hello" + "World";  // does not work 

字符串字面在C++(文本引號)不是對象,並沒有方法...就像數值不是對象。爲了使一個字符串開始行爲「像對象」,它必須被包裝到一個對象中。 QString是其中的一個包裝對象,正如C++中的std::string一樣。

不過你看到的行爲在一個b展示我們在某種程度上能夠一個字符串添加到對象。這來自哪裏左操作數是正確的爲QString是Qt擁有兩種情況定義的全局運算符重載的事實const char*

http://doc.qt.nokia.com/latest/qstring.html#operator-2b-24

...以及其他情況下左是const char*,右邊是爲QString:

http://doc.qt.nokia.com/latest/qstring.html#operator-2b-27

如果這些不存在,那麼你將不得不寫:

QString a = h + QString("World"); 
QString b = QString("Hello") + w; 

如果你願意,你仍然可以這樣做。在這種情況下,你會導致運行將是兩個操作數爲QString的加過載:

http://doc.qt.nokia.com/latest/qstring.html#operator-2b-24

但如果連這不存在,你就必須調用一個成員函數。例如,追加():

http://doc.qt.nokia.com/latest/qstring.html#append

事實上,你可能會注意到,有沒有過載追加到字符串的整數。 (然而,有一個char。)所以如果你的TipsCount是一個整數,你必須找到一些方法把它變成一個QString。靜態number()方法是一種方法。

http://doc.qt.nokia.com/latest/qstring.html#number

所以,你可能會發現你需要:

ui->button->setText(QString(" Tips ") + "\n" + QString::number(TipsCount));