QStandarditem在构造函数中拒绝QString

时间:2016-03-26 17:14:22

标签: c++ qt constructor

我在Qt中用c ++编程。当我构建QStandardItem时,它不接受之前声明的QString

    file_content = new QString(textstream->readAll().mid(10,2)) ;
    standard_model->setItem(0,0,new QStandardItem(file_content));

但是当我尝试QStandardItem("example")时,它可以正常工作。

1 个答案:

答案 0 :(得分:1)

您的问题是您使用的是动态分配的字符串。 QStandardItem的构造函数需要QString &,而不是QString *

由于指针基本上是一个整数,因此使用指针会使编译器混淆解析为QStandardItem(int rows, int columns = 1)构造函数。

如果你standard_model->setItem(0,0,new QStandardItem(*file_content));它会起作用,但适当的是:

QString file_content = textstream->readAll().mid(10,2);
standard_model->setItem(0,0,new QStandardItem(file_content));

QString在内部使用动态分配,并且它是隐式共享的。绝对没有理由为它使用动态分配。

除非您知道必须,否则请勿使用动态分配。在Qt中,经验法则(极少数例外)是如果它是QObject派生的,你应该动态分配,因为这样的对象具有唯一的身份并且不能被复制,而Qt的容器类使用CoW并且是隐含的共享 - 即使按值传递它们也非常有效,在大多数情况下,正确的做法是将它们放在堆栈而不是堆栈上。