在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()函数接收指针而不是对象本身,因为我不希望编译器将整个对象传递给参数中的函数,它会更慢。
答案 0 :(得分:2)
text()
返回QString
值,而不是指针,因此您无法将其直接传递给您的函数。
最佳选择是更改您的函数以获取值QString
或引用const QString &
。 const
对于引用参数是必需的,以允许参数为常量。
我不希望编译器将整个对象传递给参数中的函数,它会更慢。
复制elision,并移动语义(如果Qt支持它们),意味着它可能不会慢。但是如果你关注速度,并且发现按值传递是一个瓶颈,那么通过引用传递应该和传递指针一样快。
答案 1 :(得分:0)
QLineEdit.text()
会返回QString
而不是QString *
。您需要更改代码才能获得QString
或const 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信号/槽连接这两个对象。 在这种情况下,两个通信的对象甚至不需要指向另一个的指针/引用......