我想在此添加一个新行。这是我的示例代码:
ui->button->setText(" Tips " + "\n" + TipsCount );
这是它显示的错误:
类型'const char [7]'和'const char [2]'到二进制'operator +'的无效操作数
但是当我添加到标签时,它会被附加!
ui->label->setText(name + "\n" + City );
有人可以帮帮我吗?
答案 0 :(得分:5)
这是C ++中一个非常常见的问题(一般而言,不仅仅是QT)。
由于运算符重载的神奇之处,name + "\n"
变成了一个方法调用(由于你没有列出类型,所以无法说出哪一个)。换句话说,因为其中一个是+
重载的对象,所以它可以工作。
然而,当你尝试"abc" + "de"
时,它会爆炸。原因是编译器尝试将两个数组一起添加。它不明白你的意思是连接,并试图把它当作算术运算。
要更正此问题,请将字符串文字包装在相应的字符串对象类型中(std::string
或QString
)。
答案 1 :(得分: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
一样。
然而,您在 a 和 b 中看到的行为表明我们能够以某种方式将字符串文字添加到对象。这是因为Qt已经为左操作数是一个QString且右边为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
但即使 不存在,也必须调用成员函数。例如,append():
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));