引用 QString

refering to a QString

在 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() 函数接收指针而不是对象本身,因为我不希望编译器将整个对象传递给参数中的函数,这样会更慢。

QLineEdit.text() returns QString 不是 QString *。您需要更改代码以获取 QStringconst QString &

我会推荐:

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

并且只需使用 QLineEdit::text()。

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

text() returns 一个 QString 值,不是指针,所以你不能将它直接传递给你的函数。

最好的选择是将您的函数更改为取值 QString 或引用 const QString &const 是引用参数所必需的,以允许参数成为常量。

I don't want the compiler to pass the entire object to the function in the arguments, it would be slower.

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

In QT 5.2 how do I get a QString pointer to the data in a QLineEdit ?

基本上你不能。 API 只给你一个 QString 对象的副本。

但是 QString 的复制成本很低,因为它利用写时复制原理。这意味着,除非您不更改 QString 的副本,否则拥有任意数量的 QString 副本是很便宜的。这些将是浅拷贝。

传递对象还有代码可读性和可维护性等其他积极方面(对于指针,您始终必须定义谁负责内存释放)

通常 QObjects 或任何精心设计的 class 不会通过指向其成员的指针为您提供访问权限。它破坏了 classes 封装,被认为是糟糕的设计。您将获得一份副本,如本例中的 QLineEdit::text() 并且您可以使用该副本进行处理。 传递原始指针的问题也在于,您不确切知道哪个对象拥有指针后面的内存并且应该删除它。 如果我真的需要传递 arround 动态分配的对象(及其所有权),我会使用智能指针作为 QSharedPointer 等。 如果所有权没有传递给另一个对象,那么我只需要该对象来调用它的函数,我更喜欢引用该对象来访问它,或者以真正松散的耦合来实现,并用 Qt 连接两个对象 signal/slots . 在这种情况下,两个通信对象甚至不需要 pointer/reference 到另一个...