11.5. Классы QString и QVariant.
Строки используются практически во всех программах ничуть не реже других типов.
Язык C++ предоставляет два типа строк: традиционные строки языка C — массивы символов, завершающиеся символом ‘\0’ и класс string. Qt предоставляет гораздо более мощный класс QString. Он предназначен для хранения строк с 16-ти битными символами Unicode. Unicode содержит наборы символов ASCII и Latin-1 с их обычными числовыми значениями. Но поскольку каждый символ в QString представлен 16-ю битами, он может содержать тысячи других символов. Дополнительную информацию об Unicode вы найдете в Главе 15.
Конкатенация двух строк QString может выполняться двухместным оператором «+» или оператором «+=». Ниже приводится пример использования обоих операторов:
QString str = "User: "; str += userName + "\n";
Кроме того, имеется функция QString::append(), которая идентична по своему действию оператору «+=»:
str = "User: "; str.append(userName); str.append("\n");
И совершенно иной подход к объединению строк состоит в использовании функции QString::sprintf():
str.sprintf("%s %.1f%%", "perfect competition", 100.0);
Она поддерживает тот же набор спецификаторов формата, что и библиотечная функция sprintf(). В примере выше, в строку str будет записана строка «perfect competition 100.0%».
Еще один способ «сборки» строки из других строк и чисел — использовать arg():
str = QString("%1 %2 (%3s-%4s)") .arg("permissive").arg("society").arg(1950).arg(1970);
В этом примере «%1» будет заменено словом «permissive», «%2» — «society», «%3» — «1950» и «%4» — «1970». В результате получится строка «permissive society (1950s-1970s)». Класс имеет несколько перегруженных функций arg() для обработки различных типов данных. Некоторые из них имеют дополнительные параметры, управляющие длиной выходной строки, базой системы счисления и точностью представления чисел с плавющей точкой. В большинстве случаев arg() представляет лучшее решение, чем sprintf(), потому что она более безопасна, полностью поддерживает Unicode и позволяет переводчикам изменять порядок следования параметров «%n» .
QString позволяет преобразовывать числа в их строковое представление, с помощью статической функции QString::number():
str = QString::number(59.6);
или с помощью QString::setNum():
str.setNum(59.6);
Обратное преобразование может быть выполнено функциями toInt(), toLongLong(), toDouble() и т.д., например:
bool ok; double d = str.toDouble(&ok);
Эти функции могут принимать необязательный аргумент типа bool, в котором возвращается признак успеха преобразования. Если преобразование не может быть выполнено, они всегда возвращают 0.
Зачастую возникает ситуация, когда необходимо извлечь часть строки. Функция mid() возвращает подстроку заданной длины, начиная с заданной позиции в исходной строке. Например, следующий код выводит строку «pays»:
QString str = "polluter pays principle"; cerrЕсли опустить второй аргумент (или передать в качестве второго аргумента число -1), функция вернет подстроку, начиная с заданной позиции и до конца исходной строки. Например, следующий код выведет строку "pays principle":
QString str = "polluter pays principle"; cerrДополнительно имеются функции left() и right(). Они обе принимают количество символов n и возвращают первые или последние n символов исходной строки, соответственно. Например, следующий код выведет строку "polluter principle":
QString str = "polluter pays principle"; cerrЕсли нужно выполнить проверку -- начинается ли или заканчивается ли строка определенной комбинацией символов, для этих целей существуют функции startsWith() и endsWith():
if (uri.startsWith("http:") && uri.endsWith(".png")) .Это гораздо быстрее и проще, чем:
if (uri.left(5) == "http:" && uri.right(4) == ".png") .Оператор сравнения строк "==" чувствителен к регистру символов. Для выполнения регистронезависимого сравнения, можно воспользоваться функциями upper() или lower(), например:
if (fileName.lower() == "readme.txt") .Для замены одной подстроки в строке другой подстрокой, используйте функцию replace():
QString str = "a sunny day"; str.replace(2, 5, "cloudy");в результате получится строка "a cloudy day". То же самое действие может выполнено с помощью функций remove() и insert():
str.remove(2, 5); str.insert(2, "cloudy");В первой строке удаляется пять символов, начиная со 2-й позиции, в результате получается строка "a day" (с двумя пробелами), затем, во второую позицию вставляется слово "cloudy".
Существуют перегруженные версии функции replace(), которые заменяют все вхождения первого аргумента на второй. Например, чтобы заменить все символы '&' в строке на "&":
str.replace("&", "&");Очень часто возникает необходимость выбросить из начала и конца строки все лишние пробельные символы (такие как: пробелы, символы табуляции, символы перевода строки). Для этой цели существует функция stripWhiteSpace():
QString str = " BOB \t THE \nDOG \n"; cerr Строка str может быть изображена как:А результат, возвращаемый функцией stripWhiteSpace(), как:
Для удаления лишних пробельных символов, как на концах строки, так и внутри, предназначена функция simplifyWhiteSpace():
QString str = " BOB \t THE \nDOG \n"; cerr Результат работы функции будет выглядеть так:Строки могут быть разбиты на подстроки с помощью функции QStringList::split():
QString str = "polluter pays principle"; QStringList words = QStringList::split(" ", str);В этом примере, строка "polluter pays principle" разбивается на три подстроки; "polluter", "pays" и "principle". Функция split() может принимать третий необязательный параметр типа bool, который определяет -- должны ли игнорироваться пустые подстроки (по-умолчанию) или нет.
Элементы списка QStringList могут быть объединены в одну строку, с помощью функции join(). В качестве аргумента ей передается строка, которая должна быть вставлена между объединяемыми строками. Например, следующий код демонстрирует, как можно объединить все строки в списке, отсортированном по алфавиту, в единую строку, причем подстроки отделяются друг от друга символом перевода строки:
words.sort(); str = words.join("\n");Еще одна немаловажная операция над строками -- определение длины строки. Для этого предназначена функция length() и, как вариант, isEmpty(), которая возвращает true, если длина строки равна 0.
QString различает пустые строки и несуществующие (NULL) строки. Эти различия корнями уходят в язык программирования C. Чтобы проверить -- существует ли строка, можно вызывать функцию isNull(). Для большинства приложений очень важно знать -- содержит ли строка хотя бы один символ. Функция isEmpty() вернет true, если строка не содержит ни одного символа (пустая или несуществующая строка).
Преобразования, между const char * и QString, в большинстве случаев выполняются автоматически:
str += " (1870)";Этот код добавляет строку типа const char * к строке типа QString.
В некоторых ситуациях возникает необходимость явно выполнять преобразование между const char * и QString. Чтобы преобразовать строку QString в const char *, используйте функцию ascii() или latin1(). Обратное преобразование может быть выполнено за счет операции приведения типа.
Когда вызываются функции ascii() или latin1(), или когда выполняется автоматическое преобразование к типу const char *, возвращаемая строка принадлежит объекту QString. Это означает, что нас не должна беспокоить проблема утечки памяти -- Qt самостоятельно утилизирует память, по мере необходимости. С другой стороны, необходимо проявлять большую осторожность при работе с указателями. Например, если оригинальная версия строки QString будет изменена, то ранее полученный указатель на const char * может оказаться недопустимым. Если же необходимо сохранить предыдущий вариант строки, то для этих целей можно воспользоваться услугами класса QByteArray или QCString. Они хранят полную копию данных.
Класс QString поддерживает implicit sharing (неявное совместное использование данных). Это означает, что на копирование строки уходит времени не больше, чем необходимо для копирования указателя на строку. Собственно копирование производится только тогда, когда выполняется попытка изменить одну из копий. Все это делается автоматически и незаметно для нас.
Вся прелесть неявного совместного использования данных состоит в том, что таким образом оптимизируется скорость выполнения операций и при этом нам не нужно постоянно помнить об этом -- это просто работает!
Qt использует это метод оптимизации и для других классов, включая: QBrush, QFont, QPen, QPixmap, QMap, QValueList и QValueVector . Что повышает эффективность передачи экземпляров классов по значению, как в виде аргументов функций, так и в виде возвращаемых значений.
C++ -- это строго типизированный язык, однако, иногда возникает необходимость сохранять данные в более общем виде. Самый простой способ -- использовать строки. Например, строки могут хранить текстовые или числовые данные. Qt предоставляет более простой способ работы с переменными -- класс QVariant.
Класс QVariant может хранить значения многих типов Qt: QBrush, QColor, QCursor, QDateTime, QFont, QKeySequence, QPalette, QPen, QPixmap, QPoint, QRect, QRegion, QSize и QString.. Он так же может хранить контейнеры: QMap, QStringList и QValueList.. Мы уже использовали QVariant, когда разрабатывали приложение Spreadsheet, в Главе 4, для хранения содержимого ячейки.
Одно из обычных применений класса QVariant -- создание словарей (map), в которых в качестве ключа используются строки, а в качестве значений -- экземпляры класса QVariant. Как правило, информация о конфигурации приложения сохраняется и загружается с помощью QSettings, но иногда приложения могут обслуживать настройки напрямую, например, сохраняя их в базе данных. QMap идеально подходит в таких ситуациях:
QMap config; config["Width"] = 890; config["Height"] = 645; config["ForegroundColor"] = black; config["BackgroundColor"] = lightGray; config["SavedDate"] = QDateTime::currentDateTime(); QStringList files; files Принцип Действия Неявного Совместного Использования ДанныхМеханизм неявного совместного использования данных работает полностью автоматически и незаметно для нас. Таким образом, когда мы используем классы, поддерживающие этот механизм, мы не должны писать дополнительный код, который поддерживал бы его работу. Но знать принцип его действия вам все таки необходимо, поэтому рассмотрим простенький пример и исследуем -- что же скрыто от наших глаз.
QString str1 = "Humpty"; QString str2 = str1;Здесь в переменную str1 записывается строка "Humpty" и затем выполняется присваивание переменной str2. С этого момента обе переменные указывают на одну и ту же структуру данных в памяти (типа QStringData). Вместе с символами строки она хранит счетчик ссылок, который содержит количество объектов, ссылающихся на нее. Поскольку и str1, и str2 ссылаются на одни и те же данные, то счетчик ссылок равен 2.
str2[0] = 'D';Когда выполняется изменение содержимого переменной str2, то прежде всего создается полная копия данных, таким образом, теперь str1 и str2 ссылаются на различные структуры и все изменения будут производиться над их собственными копиями данных. Счетчик ссылок переменной str1 ("Humpty") теперь стал равен 1 и счетчик ссылок переменной str2 ("Dumpty") так же стал равен 1. Когда счетчик ссылок равен 1, это означает, что данные используются только одним объектом.
str2.truncate(4);Если теперь выполнить модификацию переменной str2, то никакого копирования производиться уже не будет, потому что счетчик ссылок равен 1. Функция truncate() будет оперировать с данными, принадлежащими переменной str2, и счетчик ссылок останется равным 1.
str1 = str2;После такого присваивания, счетчик ссылок переменной str1 станет равным 0, это означает, что строка "Humpty" больше не нужна. В этом случае память, ранее занимаемая переменной str1, будет освобождена. Теперь обе переменные будут ссылаться на строку "Dump", а счетчик ссылок станет равным 2.
Создание классов, использующих оптимизацию неявного совместного использования данных, выполняется довольно просто. В ежеквартальнике Qt Quarterly , в статье "Data Sharing with Class" ( http://doc.trolltech.com/qq/qq02-data-sharing-with-class.html) описывается -- как это сделать.
Обход в цикле элементов словаря, который хранит значения в вариантном виде, может оказаться не такой простой задачей, если некоторые из значений являются контейнерами. Чтобы проверить тип вариантного значения вам придется воспользоваться функцией type():
QMap::const_iterator it = config.begin(); while (it != config.end())
С помощью QVariant можно создавать довольно сложные структуры данных, хранящие значения контейнерного типа:
QMap price; price["Orange"] = 2.10; price["Pear"].asMap()["Standard"] = 1.95; price["Pear"].asMap()["Organic"] = 2.25; price["Pineapple"] = 3.85;В этом примере был создан словарь со строковыми ключами (название продукта) и значениями типа double (цена) или типа QMap. Словарь верхнего уровня содержит три ключа: "Orange", "Pear" и "Pineapple". Значение, связанные с ключом "Pear" -- это словарь с двумя ключами ("Standard" и "Organic").
Возможность создания структур данных, подобных этой, может показаться очень соблазнительной, так как можно структурировать данные по своему усмотрению. Но удобство QVariant -- вещь дорогостоящая. Ради удобочитаемости придется пожертвовать быстродействием.
| Пред. | В начало | След. |
| Контейнеры указателей. | На уровень выше | Базы данных. |
Как преобразовать qstring в char
Привет! Помогите перевести строку типа QString в char*
Делаю таким образом:
QString *qs = new QString("переведи меня в чары! :)"); QByteArray qb = qs->toUtf8(); char *ch = qb.data();
Re: QT: QString to char*
| От: | Shellac | |
| Дата: | 10.04.11 09:58 | |
| Оценка: | 3 (1) -2 | |
Здравствуйте, HunteX, Вы писали:
HX>Привет! Помогите перевести строку типа QString в char*
HX>Делаю таким образом:
HX>
HX>QString *qs = new QString("переведи меня в чары! :)"); HX>QByteArray qb = qs->toUtf8(); HX>char *ch = qb.data(); HX>
QString test; char* ctest = test.toAscii().data();
Re[2]: QT: QString to char*
| От: | HunteX | http://troyashka.ru/ |
| Дата: | 10.04.11 10:09 | |
| Оценка: |
Здравствуйте, Shellac, Вы писали:
S>Здравствуйте, HunteX, Вы писали:
HX>>Привет! Помогите перевести строку типа QString в char*
HX>>Делаю таким образом:
HX>>
HX>>QString *qs = new QString("переведи меня в чары! :)"); HX>>QByteArray qb = qs->toUtf8(); HX>>char *ch = qb.data(); HX>>
S>QString test; S>char* ctest = test.toAscii().data(); S>
Спасибо! Минутой ранее реализовал вот так:
qs.toLocal8Bit().data()
Re[3]: QT: QString to char*
| От: | Shellac | |
| Дата: | 10.04.11 13:17 | |
| Оценка: | +1 | |
Здравствуйте, HunteX, Вы писали:
HX>Спасибо! Минутой ранее реализовал вот так:
Для спасибо есть кнопка специальная
Re[4]: QT: QString to char*
| От: | Ops |
| Дата: | 10.04.11 14:52 |
| Оценка: |
Здравствуйте, Shellac, Вы писали:
S>Здравствуйте, HunteX, Вы писали:
HX>>Спасибо! Минутой ранее реализовал вот так:
S>Для спасибо есть кнопка специальная
Эта кнопка для кого-то актуальна?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: QT: QString to char*
| От: | dikarrus |
| Дата: | 10.04.11 21:14 |
| Оценка: |
HX>QString *qs = new QString("переведи меня в чары! :)"); HX>QByteArray qb = qs->toUtf8(); HX>char *ch = qb.data();
На Qt 3.3.3 вот такое работает:
QString *qs = new QString("переведи меня в чары! :)"); char *ch = qs.data();
Re[2]: QT: QString to char*
| От: | K13 | http://akvis.com |
| Дата: | 11.04.11 05:22 | |
| Оценка: | +2 | |
Здравствуйте, Shellac, Вы писали:
S>
S>QString test; S>char* ctest = test.toAscii().data(); S>
Очень рискованно, особенно если прокинуть ctest как параметр в какую-нибудь функцию.
Потому что указатель торчит в уже освобожденную память временного объекта QByteArray.
UB в чистом виде.
Кодировка зависит от обстановки: .toAscii() / .toLocal8Bit() / .toUtf8()
Но результирующий QByteArray нужно либо копировать в локальный объект либо держать по константной ссылке.
Re: QT: QString to char*
| От: | sc |
| Дата: | 11.04.11 05:59 |
| Оценка: |
Здравствуйте, HunteX, Вы писали:
HX>Привет! Помогите перевести строку типа QString в char*
HX>Делаю таким образом:
HX>
HX>QString *qs = new QString("переведи меня в чары! :)"); HX>QByteArray qb = qs->toUtf8(); HX>char *ch = qb.data(); HX>
QString *qs = new QString("переведи меня в чары! :)"); QByteArray qb = qs->toLocal8Bit(); char *ch = qb.data();
QString *qs = new QString("переведи меня в чары! :)"); char const* ch = qs->toLocal8Bit().constData();
иначе кодировка может подпортится
Re[3]: QT: QString to char*
| От: | jyuyjiyuijyu |
| Дата: | 11.04.11 06:45 |
| Оценка: |
Здравствуйте, K13, Вы писали:
K13>Здравствуйте, Shellac, Вы писали:
S>>
S>>QString test; S>>char* ctest = test.toAscii().data(); S>>
K13>Очень рискованно, особенно если прокинуть ctest как параметр в какую-нибудь функцию.
K13>Потому что указатель торчит в уже освобожденную память временного объекта QByteArray.
K13>UB в чистом виде.
void f(char*)<> QString test; f(test.toAscii().data());
гарантируется же что временный QByteArray не сдохнет пока мы не выйдем из вызванной функции ?
Re[3]: QT: QString to char*
| От: | jyuyjiyuijyu |
| Дата: | 11.04.11 07:30 |
| Оценка: |
Здравствуйте, K13, Вы писали:
и если гарантируется то почему нельзя? взять неконстантную ссылку вот так
void f(QByteArray&)<> QString test; f(test.toAscii());
получается он что так что так живет пока мы не выйдем из функции зачем было запрещать неконстантную ссылку ?
или можно ?
понимаю в таком контексте опасно неконстантную ссылку брать
хотя для студии все будет гуд
string f() < return "qwerty"; >int main()
но вот при вызове то функции зачем запрещать
неконстантную ссылку объект же живет до возвращения ?
что в этом коде плохого если гарантируется что объект сдохнет только по возвращении
void f(QByteArray&)<> QString test; f(test.toAscii());
QString to char* conversion
I was trying to convert a QString to char* type by the following methods, but they don't seem to work.
//QLineEdit *line=new QLineEdit(); QString temp=line->text(); char *str=(char *)malloc(10); QByteArray ba=temp.toLatin1(); strcpy(str,ba.data());
Can you elaborate the possible flaw with this method, or give an alternative method?
52.3k 39 39 gold badges 111 111 silver badges 136 136 bronze badges
asked Mar 26, 2010 at 13:59
9,219 14 14 gold badges 48 48 silver badges 57 57 bronze badges
Your example works fine for me, where is the problem?
Mar 26, 2010 at 14:05
Sorry for my English but why it isn't right to use such approach? QString s("some"); printf(reinterpret_cast
Jul 7, 2012 at 14:27
10 Answers 10
int main(int argc, char **argv)
So perhaps you're having other problems. How exactly doesn't this work?
624 5 5 silver badges 21 21 bronze badges
answered Mar 26, 2010 at 14:02
Eli Bendersky Eli Bendersky
266k 89 89 gold badges 353 353 silver badges 413 413 bronze badges
const char* and char* are not the same type.
Nov 15, 2012 at 22:12
@LightnessRacesinOrbit: writing to QString's contents without it knowing is a horrible idea, hence of course const char* is what can really be obtained. The user is free to copy the data to a writable buffer.
Nov 16, 2012 at 14:28
I completely agree. However, the question asked about char* , not char const* , and your answer simply ignores that fact without mention.
Nov 16, 2012 at 16:48
@LightnessRacesinOrbit: sometimes the best answer is to unask the question. In other words, to point out that it's not asking the right thing. This answer was accepted by the question poster, so I suppose it hit its target
Nov 16, 2012 at 23:38
seems like the FAQ has been updated to use toLocal8Bit() ?
Mar 26, 2018 at 18:42
or safer, as Federico points out:
std::string str = my_qstring.toStdString(); const char* p = str.c_str();
It's far from optimal, but will do the work.
answered Jun 1, 2010 at 23:56
3,452 2 2 gold badges 19 19 silver badges 14 14 bronze badges
This will mess up Unicode characters. A Unicode-friendly solution: stackoverflow.com/a/4644922/238387
Sep 18, 2012 at 19:35
This method is very dangerous and should not be used: toStdString() return a new std::string object and then the pointer to internal data const char * is obtained. However, the string object is immediately destroyed after this statement, so the result pointer probably does not have a valid address if you use it in a subsequent statement.
Mar 6, 2016 at 12:32
@RicoRico It's not the method toStdString() that's dangerous; it's the use of raw pointers. Or, more specifically, the use of raw pointers from objects whose scopes aren't well-understood.
Oct 20, 2019 at 20:23
Specifically C++ temporaries normally live until the end of the statement that creates them. So the first form in the answer is ok if it's used in-line in a function call (assuming the function doesn't store the pointer for future use) but it's not ok if it's assigned to a variable.
Nov 8, 2019 at 19:04
As @plugwash says, f(qstr.toStdString().c_str()) is ok from the point of view of temporary lifetime (extended until the end of f ). However, the evaluation order of a.b is only guaranteed to be a before b from C++17 onwards. I guess most implementations would already work that way in practice, but strictly speaking I believe it would be UB before C++17
Как преобразовать qstring в char
Класс QString имеет два метода, которые возвращают указатель на бинарные данные строки:
Метод data() возвращает указатель на данные самой строки, метод constData() возвращает указатель на неизменяемые данные ( const ). Возвращаемый тип этих методов - QChar* .
Получить неизменяемую unsigned char* строку из QString можно следующим образом (через преобразование типа QChar* в unsigned char*):
const unsigned char *myString = (const unsigned char*) myQtString.constData();
printf("My string: %s\n", myString);
В большинстве случаев лучше пользоваться указателем на неизменяемые данные, чтобы не повредить строку.
- Заготовка виджета, *.cpp файл
- Заготовка виджета, *.h файл
- Qt как побороть вывод предупреждения о неиспользуемой переменной
- Как получить индекс QModelIndex по номеру строки, столбца
- Как выбрать элемент в виде так, как если бы по нему кликнули мышкой
- Информация об отправителе сигнала
- Слои и this, ошибки
- Как настроить QSlider
- C++ и Qt - Глобальные клавиши (hotkeys) в X11, Windows, MacOS
- Вставка картинок в QTextEdit
- QTextEdit - как очистить произвольный параграф
- QTextEdit - как указать обтекание при вставке картинки
- QTextEdit - как выяснить имена всех картинок, находящихся в тексте
- Как из QVector сделать двумерный (многомерный) массив
- Куда устанавливается Qt в различных дистрибутивах Linux
- Qt4: Программирование моделей и представлений. Подробное объяснение на русском языке.
- Программирование моделей в Qt - рекомендации по использованию, неочевидные моменты
- Как в Qt сделать преобразование из QString в число int и обратно
- Qt: преобразование строки в число и числа в строку
- Беседы о Qt: Парадигма Model-View
- Модели-Посредники в Qt
- Qt: Как узнать все методы объекта во время выполнения программы
- Как изменить стиль оформления в Qt? (Рецепты для Qt5)
- Как вывести на экран окно с сообщением (пример)
- Как запомнить геометрию главного окна
- Как добавить свой тип в QVariant, и как добавить указатель на свой тип в QVariant
- Qt: Сигналы и слоты (выдержка из документации Qt 4.x)
- Qt: как преобразовать строку QString в unsigned char*
- Qt: как преобразовать строку QString в std::string
- Как перебрать все элементы QMap или QHash через foreach, получив ключ и значение
- Как перебирать элементы QList через foreach
- Как в Qt перебрать символы в строке через foreach
- Архитектура Модель-Вид-Контроллер в Qt (Небольшой, но полный пример кода)
- Поиск объектов в Qt по имени и типу
- Как в Qt получить текущее время в формате UNIX TIMESTAMP
- Qt: абсолютные экранные координаты виджета и их преобразование
- Qt: как показать диалог или виджет в окне, чтобы он автоматически удалился при закрытии окна
- Как в Qt создать кнопку QPushButton, чтобы она была шириной с текст
- Контейнеры в Qt
- Алгоритмы для работы с контейнерами в Qt и итераторы
- Понимание работы функций qLowerBound() и qUpperBound() в Qt
- Как правильно удалять элементы из QVector или из QList в момент обхода массива (списка)
- Как добавить опции профилирования в Qt
- Как сделать так, чтобы кнопки на форме нажимались по клавише Enter а не только по пробелу
- Зачем нужен макрос Q_PROPERTY и как им пользоваться
- Что в документации Qt означает "Inherited By:" и "Inherits:"
- Как работать с QTemporaryFile
- Как в Qt быстро получить текущее время в виде строки?
- Как задать ширину кнопки QPushButton так, чтобы она вмещала только текст
- Скорость выполнения операций для контейнеров QList, QLinkedList, QVector, QQueue, QStack
- Как в QListView, QTableView или QTreeView отобразить галки (CheckBox) ?
- Как в Qt в отладочном выводе вывести название текущего класса и метода
- Пример загрузки дерева и пробегания подчиненных элементов QDomElement
- Умные указатели в Qt: статья на русском языке от IBM Developer
- Размышления об умных указателях в Qt от Андрея Боровского. Отличия QPointer и QScopedPointer
- Почему в Qt не работает мигание окном при вызове QApplication::alert()
- Как поместить указатель на объект в QMap, и затем работать с этим объектом, извлекая указатель из QMap
- Правила создания виджетов в Qt: на стеке или динамически?
- Как сделать "плавающий" виджет минимального размера
- Что делать, если сообщения в консоли Qt появляются с задержкой
- Пример подсистемы логирования в Qt с использованием qInstallMessageHandler()
- Как в Qt быстро увеличить расстояние между строками для QListView, QTableView, QTreeView
- Как правильно получить из QString строку const char *
- Классическая ошибка в работе со строками на стыке Qt и Си


