2015-01-20 3 views
0

В QT 5.2 Как получить указатель QString для данных в 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() функцию, чтобы получить указатель, а не сам объект, потому что я не хочу, чтобы компилятор передать весь объект функции в аргументах, было бы быть медленнее.

ответ

2

text() возвращает значение QString, а не указатель, поэтому вы не можете передать его непосредственно своей функции.

Наилучший вариант - изменить вашу функцию, чтобы принять значение, QString, или ссылку const QString &. const необходимо для опорного параметра, чтобы разрешить спор быть постоянным.

Я не хочу, чтобы компилятор передавал весь объект функции в аргументы, это было бы медленнее.

Скопируйте elision и переместите семантику (если Qt поддерживает их), означает, что она, вероятно, не медленнее. Но если вас беспокоит скорость, и вы обнаружите, что переход по значению является узким местом, то передача по ссылке должна быть такой же быстрой, как передача указателя.

0

QLineEdit.text() возвращает QString не QString *. Вам необходимо изменить свой код, чтобы принять QString или const QString &.

+0

@ Майк Сеймур Я удалил неправильный код и просто предложил ему изменить его функцию. – NathanOliver

+0

Кроме того, он должен быть 'const QString &', чтобы разрешить временный аргумент. –

0

Я бы рекомендовал:

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

И просто использовать QLineEdit :: текст().

EDIT: другой ответ был изменен. :)

0

В QT 5.2 Как получить указатель QString для данных в QLineEdit?

В принципе, вы не можете. API дает вам только копию объекта QString.

Но QString дешево копировать, поскольку он использует копию на принципе записи. Это означает, что пока вы не измените свою копию QString, дешево иметь столько копий, сколько захотите. Это будут мелкие копии.

Передача объекта имеет другие положительные аспекты, как читаемость кода и maintanability (в случае указателя вы всегда должны определить, кто несет ответственность за dealocation памяти)

0

Обычно объекты QObject или любой хорошо desinged класс не даст вам доступ через указатель на своих членов. Он убивает инкапсуляцию классов и считается плохим дизайном. Вы получите копию, как в этом случае QLineEdit :: text(), и вы можете использовать копию для работы. Проблема с прохождением arround raw указателей также, что вы точно не знаете, какой объект владеет памятью за указателем и должен удалить ее. Если мне нужно действительно передать arround динамически выделенные объекты (и их владение), я бы использовал умный указатель как QSharedPointer и т. Д. Если собственность не передается другому объекту, поэтому мне нужен объект только для вызова его функций, я предпочитайте ссылку на объект для доступа к нему или выполняйте его с действительно свободным соединением и соедините два объекта с сигналом/слотом Qt. В этом случае двум связанным объектам даже не нужен указатель/ссылка на другой ...

Смежные вопросы