引用QString

时间:2015-01-20 16:01:56

标签: c++ qt

在QT 5.2中如何获取QLineEdit中数据的QString指针?

例如,存在一个函数,它接受指向QString的指针:

void SomeClass::do_something(QString *qptr) {

    qWarning() << "string is " << qptr;
}

所以,我有一个QLineEdit对象,我希望指向其文本的指针用于阅读目的(我不打算修改它):

fld_title=new QLineEdit();
/// open a window and work with fld_title so title is set
/// 
some_obj->do_something(fld_title->text()); <<-- produces compile error

我声明do_something()函数接收指针而不是对象本身,因为我不希望编译器将整个对象传递给参数中的函数,它会更慢。

5 个答案:

答案 0 :(得分:2)

text()返回QString值,而不是指针,因此您无法将其直接传递给您的函数。

最佳选择是更改您的函数以获取值QString或引用const QString &const对于引用参数是必需的,以允许参数为常量。

  

我不希望编译器将整个对象传递给参数中的函数,它会更慢。

复制elision,并移动语义(如果Qt支持它们),意味着它可能不会慢。但是如果你关注速度,并且发现按值传递是一个瓶颈,那么通过引用传递应该和传递指针一样快。

答案 1 :(得分:0)

QLineEdit.text()会返回QString而不是QString *。您需要更改代码才能获得QStringconst QString &

答案 2 :(得分:0)

我建议:

void SomeClass::do_something(const QString& str ) {
    qWarning() << "string is " << str;
}

只需使用QLineEdit :: text()。

编辑:其他答案已更改。 :)

答案 3 :(得分:0)

  

在QT 5.2中如何获取QLineEdit中数据的QString指针?

基本上你不能。 API只为您提供QString对象的副本。

但QString复制起来很便宜,因为它利用了写入原则。这意味着,在您不更改QString副本之前,根据需要获得尽可能多的副本是很便宜的。那些将是浅色的。

传递对象具有其他积极方面,如代码可读性和可维护性(在指针的情况下,您始终必须定义谁负责内存处理)

答案 4 :(得分:0)

通常,QObjects或任何设计良好的类都不会通过指向其成员的指针进行访问。它杀死了类封装,被认为是糟糕的设计。您将获得一个副本,如本例QLineEdit :: text(),您可以使用该副本。 传递arround原始指针的问题也是,你不确切知道哪个对象拥有指针后面的内存,应该删除它。 如果我需要真正传递arround动态分配的对象(及其所有权),我会使用智能指针作为QSharedPointer等。 如果所有权没有传递给另一个对象,所以我只需要对象来调用它的函数,我更喜欢对象的引用来访问它,或者用真正松散的耦合来做它,并用Qt信号/槽连接这两个对象。 在这种情况下,两个通信的对象甚至不需要指向另一个的指针/引用......