![]() |
|||||||
1 | |||||||
Вопрос - Ответ для новичков по Qt21.02.2012, 11:15. Показов 114379. Ответов 23
В данной теме буду выкладывать готовые решения на вопросы новичков.
Обсуждение, замечание, критика и т.п. вещи по данной теме тут: Основные вопросы, вызывающие сложности у новичков (обсуждение)
Итак прежде чем писать какие-либо решения дам несколько, на мой взгляд, полезных советов:
Теперь непосредственно вопросы:
24
|
|
21.02.2012, 11:15 | |
Ответы с готовыми решениями:
23
Есть вопрос не для новичков Как реализовать приложение для тестирования (вопрос/ответ)
вопрос-ответ Вопрос и ответ. |
![]() |
||||||||||||||||||||||||||
21.02.2012, 11:36 [ТС] | 2 | |||||||||||||||||||||||||
Кириллица в ваших приложениях
Предположим у нас есть вот такая форма: Нам бы хотелось что бы форма содержала кириллицу, первое что приходит в голову это добавить в проект сл код:
согласитесь не красиво как-то, решается данная проблема сл способом: в функцию main (файл main.cpp) добавляем следующий код:
Не забываем так же подключить заголовочный файл:
То что нам и хотелось, но если в будущем мы захотим наше приложение перевести на др языки, то надо еще немного подкорректировать код, т.е. весь текст который вы планируете переводить на др языки стоит обернуть функцией tr() было так:
Вот в этом архиве проект который расписан в данном вопросе: Cyrillic.rar
21
|
![]() |
|||||||||||
21.02.2012, 12:07 [ТС] | 3 | ||||||||||
CheckListBox
В Qt нет столь замечательного виджета как CheckListBox, но не все так плохо как кажется, данный вопрос решается достаточно быстро и легко, для этого на форму добавляем виджет QListWidget. Теперь в конструктор формы с QListWidget добавим сл код:
Элементы очень близко расположены друг к другу, это можно поправить добавив после указанного выше кода строку:
что на мой взгляд немного удобнее ![]() Архив с проектом: ChekListBox.rar
15
|
![]() |
|||||||||||
21.02.2012, 17:34 [ТС] | 4 | ||||||||||
Перевод приложений на другие языки
И вот вы написали свое первое приложение и вы осознали что научить "разговаривать" приложение на других языках было бы очень хорошо, для это в Qt есть все необходимое. Если у вас установлен QtSDK то вы в полной боевой готовности, если же нет, то для решения данного вопроса вам понадобится два приложения QtCreator и QtLinguist. Будем считать что эти два приложения у вас установлены. Для примера я сделал приложение вот с такой формой: Как видим все не по-нашенски, учим приложение великому и могучему, для этого в файл *.pro добавляем строчку translateapp - имя файла перевода с которым будем в дальнейшем работатьДобавить эту строку можно в конец файла, роли это не играет... Теперь делаем следующее в QtCreator-e идем по пути Инструменты - Внешние - Linguist - Обновить перевод (lupdate) на англ это Update Translations (lupdate) в результате этой операции в QtCreator вы увидите сообщение подобно этому: а в каталоге где лежат исходники появится файлик translateapp_ru_RU.ts.Имейте ввиду что в файл попадут только те строки из исходников, которые вы обернули функцией tr(). Теперь открываем приложение QtLinguist и в нем открываем только что сформированный файл получим что то подобное: Думаю разобраться что, куда и как писать не составит труда, поэтом просто переводим приложение на необходимый язык, не забываем после перевода каждой строчки помечать ее переведенной, для это жмем кнопку на панели инструментов: После того как перевели все строки сохраняем изменения в файле и делаем следующее: File- Release В результате получаем файл: translateapp_ru_RU.qm находящийся рядом с файлом translateapp_ru_RU.ts. После перевода в QtLinguist файл с расширением qm можно получить и из QtCreator, для этого идем: Инструменты - Внешние - Linguist - Release Translations(lrelease) Теперь давайте научим наше приложение использовать полученный файл, для этого скопируйте этот файл (*.qm) в каталог где у вас собирается приложение (Помните про теневую сборку?) после этого в функцию main добавим следующий код:
Не забываем подключить заголовочный файлы:
Есть небольшие проблемы с тем что ваше приложение при компиляции в debug может не видеть файлы qm не смотря на то что вы положили их куда положено, тут два решения или забить на эту проблему или методу load передавать абсолютный путь к файлу, если же вы компилируете в release то данной проблемы нет. Архив с тестовым проектом: TranslateApp.rar
9
|
![]() 1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
|||||||||||||||||||||||||||||||
22.02.2012, 12:30 | 5 | ||||||||||||||||||||||||||||||
Система плагинов для вашего приложения
Вставлю и я свои 5 копеек, расскажу немножко о работе с плагинами (не теми, которые используются QtCreator-ом, а теми, которые dll-кой лежат рядышком с программой и динамически подгружаются в приложение). Для начала, создадим интерфейс для нашего плагина:
после объявления класса идёт объявление этого класса как интерфейса для плагина: поехали дальше, реализовываем наш плагин. Для этого - создаём в солюшене проект, который на выходе нам даст динамическую библиотеку (как это делать, рассказывать не буду - звыняйте, лень...) и добавляем в неё класс (в данном случае это будет FTP сервер): ftpServer.h:
Основное внимание уделяем тому, что сразу после объявления класса идёт два макроса: Реализация проста и тривиальна, весь код приводить не буду, вот кусочек: ftpServer.cpp
В принципе и всё - наш плагин готов к работе! компилируем и получаем на выходе dll-ку с плагином. Теперь было бы логично использовать наш плагин. Для этого создаём ещё один проект, который из себя будет представлять консольное приложение. и в main файл или ещё куда добавляем что-то типа:
В общем то и всё... для пущей важности добавлю наверное скриншот: Да и последнее и очень важное: проект плагина и программы которая его вызывает должн, нет да же не так: ДОЛЖНЫ быть скомпилированы в одной конфигурации (либо оба в Debug-e либо оба в Release) иначе - работать не будет. Собственно и всё, спасибо за внимание. Критика и спасибки - приветствуются ![]() если ругаеться на макрос
12
|
![]() |
||||||||||||||||||||||||||
27.02.2012, 14:57 [ТС] | 6 | |||||||||||||||||||||||||
Работаем с файлом ресурсов в QtCreator
Большинство приложений содержит в себе различного рода "дополнительны материал" в виде картинок звуков и т.п. Зачастую этот материал "вшит" в само приложение, хотя не исключаю и того что данный материал может лежать где то в директории приложения. Сейчас и разберем как "вшить" в свое приложение этот самый материал, и самое главное как им пользоваться в коде... Для начала добавить в свой проект файл ресурсов Qt, для этого на проекте щёлкаем правой кнопкой мыши и выбираем пункт: "Добавить новый...": в появившемся мастере выбираем Qt и файл ресурсов Qt: затем указываем расположение и имя файла: расположение лучше всего указывать корень каталога проекта... Жмём далее, указываем в какой проект добавить новый файл и завершаем мастер нажатием кнопки "Завершить": В результате в проекте появится файл с расширением qrc, данный файл автоматически будет добавлен в pro файл проекта, поэтому имейте ввиду что если вы добавили ранее созданный файл ресурсов, то его надо подключить в файле проекта: Как видим он пустой, прежде чем добавлять файлы, скопируйте их в каталог в котором расположен ваш проект, при этом файлы эти могу быть катализированы как вам угодно, например картинки вы можете положить в папку img, звуки в sounds и т.д. после того как все необходимое скопировали давайте добавим файлы в файл ресурсов. Для этого жмем кнопку "Добавить" и выбираем пункт "Добавить префикс": префикс лучше всего выставлять как "/" дабы избежать длинных путей при работе с ресурсами в коде. После того как добавили префикс, добавьте необходимые файлы, выбрав пункт "Добавить файлы", добавлять можно сразу выделив n-e количество файлов, в результате добавления у вас получится что то подобное: Заметьте что в файл ресурсов указывается относительный путь к добавленному файлу, именно с ним вы и будете работать в дальнейшем, так же есть возможность указать "Псевдоним" файлу, это дает возможность обращаться к файлу указав только "Псевдоним", например: вы добавили файл "/img/log.png" если ему указать "Псевдоним" например "logo" то из кода можно обращаться к файлу по псевдониму. После всех внесенных файлов сохраните файл ресурсов (Ctrl + S) и приступим к работе с добавленными файлами. Например поместим на кнопку иконку ранее добавленную в файл ресурсов, для этого переходим в сво-ва кнопку, ищем свойство "icon" открываем окно добавления ресурса: в левой части окна выбирайте подкаталог где лежит ресурс (если он есть) справа будет отображаться ресурсы: Если ресурсу задан "Псевдоним" то ресурс будет находится в <resource root>, хотя физически он будет там куда вы его положили. В правой части выбираем необходимое изображение и жмем Ок. Таким образом добавляются ресурсы с помощью GUI, через код это делается так: например добавляем картинку в Label...
Если у вас есть двоичный файл ресурсов (расширение файла rcc), то его необходимо зарегистрировать в приложении:
14
|
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16.03.2012, 11:56 [ТС] | 7 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Регулярные выражения и строки черновой вариант будет даписан и доработан!
Регулярные выражения достаточно популярный метод поиска части строки(текста) не зависимо от сложности условий поиска. В Qt за регулярные выражения отвечает класс QRegExp, он нормально работает с Unicode а значит регулярные выражения могут содержать кириллицу. Регулярные выражения в Qt состоят из 3 компонентов:
Символы и их классы Тут все достаточно просто символы и это обычное вхождения строки т.е. "search", "поиск" и т.п. т.е. строка это и есть своеобразное регулярное выражение. Теперь немного про классы. Классы символов задаются в квадратных скобках [] например: В квадратных скобка можно указывать и др символы будь-то цифры, буквы или вовсе спец символы:
Теперь немного пояснений: символ ^ работает только в том случае, если он стоит в начала выражения т.е. в этом выражении: Дабы не гадать как будет вести ваше регулярное выражение в коде его предварительно можно проверить, благо об этом позаботились как создатели Qt так и сообщество Qt разработчиков, вот ссылки на два приложения которые помогут вам проверить ваше регулярное выражение на правильность:
12
|
![]() |
|
21.03.2012, 11:36 [ТС] | 8 |
Исправляем кириллицу при ошибках компиляции
Установив QtSDK и приступив к работе, при первой же ошибка, если таковая будет, вы обнаружите неприятный баг, компилятор выводя сообщения об ошибках на русском языке, отображает их мягко сказать не корректно, выглядит это так: Проблема проявляется только при использовании компилятора от VS (насколько мне известно, хотя могу и ошибаться), так как используется кодировка DOS(866). Данная ошибка как минимум затрудняет выявления ошибок в в коде программы. Причиной тому файл jom.exe. Для исправления достаточно просто заменить этот файл на исправленный, после чего проблема уйдет. Итак оригинальный файл jom.exe находится тут: ![]() Делаем его резервную копию, после чего качаем вот этот файл: jom.zip Распаковываем на место старого файла и соглашаемся на замену. После чего можно проверить исправилась проблема или нет, откомпилировав простой проект с заведомо известной ошибкой и убедиться что с кириллицей теперь все нормально! Tут с завидной регулярностью выкладывают обновления для этого файла: jom.exe update попробуйте может там нет уже этой проблемы, я пока не пробовал ![]() На сим спасибо за внимание ![]()
11
|
08.08.2012, 15:38 | 9 | |||||||||||||||||||||||||
Отображение программы с различной формой
Долого с этим бился. Упрощю задачу кому потребуется изменить форму приложения. Будем использовать функцию setMask(). Она спрячет нужные участки программы. Участки программы для отображения зададим в QPolygon.
Готовая функция которая закруглит углы программы с нужным радиусом:
Готовая функция которая закруглит углы программы с нужным радиусом:
Применяется просто:
Удачи!
8
|
09.08.2012, 01:07 | 10 | ||||||||||
Функция определения операционной системы
Функция определяет ОС и возвращает QString с информацией о ней. Для функции добавте:
8
|
09.08.2012, 02:11 | 11 | |||||||||||||||||||||||||||||||||||
Qml - перемещение формы мышкой
Итак, qml готов: *.h
Соединяем C++ и QML, делая видимым функции С++ через элемент Qt_fun (Qt_fun - мой выбор, писать можно что угодно): *.cpp
*.h
Добавим две переменные: *.h
*.cpp
mainQml.qml
4
|
09.08.2012, 17:12 | 12 | |||||||||||||||||||||||||
Qml - графические эффекты (эффекты изменения обьектов)
В qml есть встроенные специальные эффекты для изменения различных изменений обьекта. Допустим у нас есть Rectangle :
Добавим позиции формы ( x позицию и позицию цвета ) прямоугольника:
При клике на прямоугольнике позиция и цвет меняется: А теперь добавим эффекты изменения позиции формы ( x позицию и позицию цвета ) прямоугольника: Есть два варианта (насколько я знаю): Первый вариант:
Вот пример:
Программа прилагается:
5
|
11.08.2012, 10:45 | 13 | |||||||||||||||||||||||||
Qml - создаем внешний элемент
Допустим нам нужна кнопка которая будет повторяться на форме. Чтобы не создаветь ее много раз зделаем ее отдельным элиментом. Приступим: У нас имеется форма mainQml:
Создадим новую форму в отдельном файле qml (Он обязательно должен иметь названия которое начинается с заглавной буквы): Жмем: Ctrl-N : Назовет файл qml - Push. Добавим его в файл ресусов: Pash.qml имеет такой вид:
В Push можно указывать параметры насторек (они будут замещать старые параметры):
Ну вот и все: Программа:
5
|
11.08.2012, 11:37 | 14 | ||||||||||||||||||||||||||||||
Qml - доступ к внешним элиментам
Создавши внешний элимент нам может потребоватся изменить параметры клика по ним и доступ к элиментам (наприме изменить текст на кнопке). Вот как это делал я: Итак, у нас имеется mainQml.qml и Push.qml - внешний элимент: mainQml:
В нашем случае это будет выглядеть так:
Добовляем кнопки: mainQml:
Вот что у нас получилось: А теперь назначим параметры клика в Push.qml:
Так делал я, возможно есть другое решение. Спасибо за внимание ![]() Программа:
4
|
11.08.2012, 18:36 | 15 |
Модули Qt
Иерархия классов Qt имеетчеткую внутреннюю структуру, которую важно понять, чтобы уметь хорошои интуитивно ориентироваться в этой библиотеке. Библиотека Qt — это множество классов (более 500), которые охватываютбольшую часть функциональных возможностей операционных систем,предоставляя разработчику мощные механизмы, расширяющие и, вместе с тем,упрощающие разработку приложений. При этом не нарушается идеологияоперационной системы. Qt не является единым целым, она разбита на модули:
Любая Qt-программа так или иначе должна использовать хотя бы один из модулей, в большинстве случаев это QtCore и QtGui, поэтому эти два модуля определены в программе создания make-файлов по умолчанию. Для использования других модулей в своих проектах необходимо перечислить их в проектном файле. Например, чтобы добавить модули, нужно написать:
3
|
13.08.2012, 20:05 | 16 | ||||||||||
Работа с zip архивами в Qt (разархивация)
В Qt есть не документированные классы для работы с zip архивами. Эти классы позволяют распаковывать уже существующие архивы по заданному пути, так и создавать новые архивы. Для создания используется класс QZipWriter, для распаковки QZipReader. Для использования этих классов предлагаю скопировать указанные файлы в свой проект и добавить их в компиляцию. Напишу способ разархивирования zip файлов из заданной директории. Воспользуемся классом QZipReader. В папку с пограммой добавим папку qzip (прилагается к посту). Ее содержимое: qzipreader_p.h qzipwriter_p.h qzip.cpp QZipReader и QZipWriter используют библеотеку zlib. На linux проблем не возникало, а при переносе прграммы на Windows библиотека zlib небыла найдена. Поэтому я изночально включил в проект эту библиотеку: Папка zlib: zlib-1.2.5.zip - полная библиотека zlib zlib125dll.zip - dll zlib // файлы которые потребуються для QZipReader и QZipWriter zlib.h zconf.h.in zconf.h Создадим функцию которая будет принемать путь к дериктории и возвращать результат: 1 - разархивация прошла успешно 0 - ошибка разорхивации Подключение библиотеки будет выглядеть в нашем случае вот так:
qzip.zip - библиотеки zipreader.zip - программа-пример
6
|
04.09.2012, 11:54 | 17 | ||||||||||
QLabel. Размер текста относительно ширины QLabel.
При увеличении шрифта текста и вывод его на QLabel он не всегда поместиться на обьекте и может выйти за границы: Для того что бы этого не случалось. Если ширина текта привысит ширину обьекта будем его уменьшать - чем длиннее текст тем меньше шрифт. QLabel принимает html код. Воспользуемся этим. Вот мое произвидение на эту тему:
Удачи! Программа-пример прилагается:
5
|
06.09.2012, 14:32 | 18 | ||||||||||||||||||||||||||||||
Qml. Обьединение Qml и виджетов Qt
Допусти имеется у нас итерфейс на qml:
Он переключает с помощью кнопки "Далее >>" или "<< Назад" между двумя формами Rectangle. Добавим на форму "Goodby world!" (two) допустим обьект QListWidget. Добавляем его так: MainWindow.h
Удачи! ![]() Программа-пример:
5
|
12.09.2012, 00:39 | 19 | |||||||||||||||||||||||||
Циклы в отдельном потоке.
При запуске цикла происходит подвесание GUI. Если вам нужно во время его (цикла) работы выводить информацию на GUI можно применить обновление отображения всей программы:
Для долгих циклов можно создать отдельный поток его обработки. Описываем свой класс, который будет проводить все действия:
На форме ставим две кнопки и QLabel для вывода получаемого сигнала из нашего класса
Удачи! Спасибо Humanoid. Программа:
5
|
19.09.2012, 23:22 | 20 | |||||||||||||||
Выбор кодировки текста
Для отображения нужной кодировки текста в программе можно преобразовать кодировку в нужную нам. Допустим мы имеем форму: (QLabel, QComboBox) Добавим в наш MainWindow slot и QString:
А вот реализация слота для преобразования кодека:
Спасибо за внимание! Программа-пример прилагается:
4
|
19.09.2012, 23:22 | |
19.09.2012, 23:22 | |
Помогаю со студенческими работами здесь
20
Ответ на вопрос. Вопрос - ответ. Ответ на вопрос Ответ на вопрос Ответ на вопрос. Ответ на вопрос по С++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |