Простой запуск windeployqt из Qt Creator

Tools > Options, раздел Environment, вкладка External Tools, кнопка Add Tool.

Description: Copy Qt libraries into executable directory

Executable: %{CurrentProject:QT_HOST_BINS}\windeployqt.exe

Arguments: --compiler-runtime %{CurrentRun:Executable:NativeFilePath}

Всё, windeployqt запускается для текущего проекта из меню Tools > External > <что вы там себе настроили>.

Создать ярлык на рабочем столе

Также можно создавать ярлыки на рабочем столе, но для этого нужен установленный git.

Description: Create shortcut on the desktop

Executable: C:\Program Files\Git\mingw64\bin\create-shortcut.exe

Arguments: %{CurrentRun:Executable:NativeFilePath} %USERPROFILE%\Desktop\%{CurrentProject:Name}.lnk


Запуск lrelease средствами qmake

Итак, у нас есть проект qmake, использующий систему интернационализации Qt (QObject::tr() и всё остальное). Мы создали с помощью lupdate файлы .ts, перевели их с помощью Linguist и добавили в VCS. Файлы .qm в VCS мы добавлять не хотим (потому что нечего в VCS делать автоматически генерируемым бинарным файлам), но используем их в приложении (например, подгружая из ресурсов). Теперь у нас есть проблема - проект не соберётся "с нуля", перед сборкой нужно вспомнить про переводы и вызвать lrelease, найдя его где-то в дебрях меню Qt Creator.

Я не ставил перед собой задачи супер-пупер автоматизации как, например, здесь. Мне просто хотелось, чтобы коллеги могли затянуть мой проект из репозитория и без лишних телодвижений собрать его по Ctrl+B, не ломая себе голову, почему это вдруг в консоль сборки посыпались ошибки линковки. Поэтому я немного упростил это решение. В результате получился следующий кусочек кода, который нужно вставить в файл проекта. Перебираем в цикле файлы .ts, запуская для каждого lrelease.

qtPrepareTool(LRELEASE, lrelease)
for(tsfile, TRANSLATIONS) {
    qmfile = $$replace(tsfile, \.ts, .qm) # search pattern is a regexp, so we use a backslash
    command = $$quote($$LRELEASE) -removeidentical $$quote($$system_path($$tsfile)) -qm $$quote($$system_path($$qmfile))
    system($$command) | error("Failed to run: $$command")
}

Можно оформить этот код как внешнюю функцию с помощью defineTest, поместить его в отдельный .pri файл и использовать в разных проектах.

Context menu search

[["-1","Yandex","http://yandex.ru/yandsearch?text=TESTSEARCH",true],["-1","Duckduckgo","https://duckduckgo.com/?q=TESTSEARCH",true],["-1","----------------","",true],["-1","Википедия","https://ru.wikipedia.org/w/index.php?search=TESTSEARCH",true],["-1","Wikipedia (EN)","http://en.wikipedia.org/w/index.php?title=Special:Search&search=TESTSEARCH",true],["-1","----------------","",true],["-1","Multitran EN-RU","http://www.multitran.ru/c/m.exe?l1=1&l2=2&s=TESTSEARCH",true],["-1","Lingvo Live EN-RU","https://www.lingvolive.com/ru-ru/translate/en-ru/TESTSEARCH",true],["-1","Translate EN-RU","https://translate.google.ru/#en/ru/TESTSEARCH",true],["-1","Translate RU-EN","https://translate.google.ru/#ru/en/TESTSEARCH",true],["-1","----------------","",true],["-1","Google Maps","https://www.google.ru/maps/search/TESTSEARCH",true],["-1","Google Images","http://www.google.com/images?q=TESTSEARCH",true],["-1","Picasa","http://picasaweb.google.com/lh/view?q=TESTSEARCH&psc=G&filter=1#",true],["-1","YouTube","http://www.youtube.com/results?search_query=TESTSEARCH",true],["-1","----------------","",true],["-1","Google News","http://news.google.com/news/search?q=TESTSEARCH",true],["-1","CNN","http://edition.cnn.com/search/?query=TESTSEARCH&primaryType=mixed&sortBy=date",true],["-1","IMDB","http://www.imdb.com/find?s=all&q=TESTSEARCH",true],["-1","----------------","",true],["-1","gdeposylka.ru","https://gdeposylka.ru/courier/postnl/tracking/TESTSEARCH",true],["-1","17track.net","http://www.17track.net/en/track?nums=TESTSEARCH",true],["-1","pochta.ru","https://www.pochta.ru/tracking#TESTSEARCH",true]]

qmake

Решил тут глянуть, чему у меня равна переменная CONFIG. Сперва мне показалось, что передо мной не значение переменной системы сборки, а облако тегов с сайта сумасшедшего сеошника.

Project MESSAGE: lex yacc debug exceptions depend_includepath testcase_targets import_plugins import_qpa_plugin rtti_off incremental_off windows qt warn_on release link_prl incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe release shared rtti no_plugin_manifest qpa win32 msvc copy_dir_files release ReleaseBuild Release build_pass debug release ReleaseBuild Release build_pass

русский текст в code::blocks

Наличие русского текста в программе иногда приводит к "крякозябрам" в консоли или непонятным ошибкам компилятора (например: compile error - converting to execution character set: Illegal byte sequence). Для решения проблем с русским текстом в code::blocks достаточно правильно определить входную и выходную кодировку, то есть кодировку файлов, в которых хранится исходный код, и кодировку консоли (для консольного приложения).

Идём в Project --> Build options...

Выбираем общие опции проекта (то есть не debug и не release);

На вкладке Compiler settings раскрываем вкладку Other options;

Дописываем, например, такую строчку:

-finput-charset=windows-1251 -fexec-charset=cp866

Изменить кодировку самих исходников можно через меню Edit --> File encoding.

Скрипты к foobar2000

Мануал по функциям

Запрещённые символы (скобки и т.п.) заключаются в одинарные кавычки.

Заголовок окна

  1. $ifequal(%ispaused%,1, $char(1472) $char(1472) ,)[%tracknumber% $char(1632) ]%title% $char(8226) [%artist% $char(8226) ]['['$if2($meta(year),$meta(date))']' ][$char(171)%album%$char(187) $char(8226) ]foobar2000  


Название композиции

  1. $puts(tlist_title3,[ %queue_indexes% ]$if($or($strcmp(%album artist%,VA),$strcmp(%band%,Various),$strcmp(%band%,VA),$strcmp(%va%,1),$not($len(%album%)>=1)),[%artist% - ]%title%,%title%))  


Скрипт, вырезающий из %filename% кусок от первого до последнего "-". Заодно заменяет подчёркивания на пробелы и Меняет Регистр Букв.

  1. $caps($replace($substr(%filename%,$add(2,$strchr(%filename%,-)),$add(-2,$strrchr(%filename%,-))),_, ))  


То же самое, но от последнего "-" до конца.

  1. $caps($replace($substr(%filename%,$add(2,$strrchr(%filename%,-)),$len(%filename%)),_, ))  

Как прикрутить к code::blocks внешний редактор ресурсов

Оказывается, как и любой другой внешний редактор, не просто, а очень просто.

Settings > Environment settings > Files extension handling, добавить нужное расширение (*.rc в данном случае).

Collapse )

После этого по умолчанию файл будет открываться во внешней программе, но через контекстное меню можно будет открыть и как раньше.

Как создать приложение в стиле Windows XP (подключение манифеста)


Изначально элементы созданного вами приложения будут выглядеть как в старых версиях Windows - простые и квадратные. Для того, чтобы использовать новые стили, появившиеся начиная с Windows XP, нужно выполнить несколько простых действий. В общем и целом они сводятся к следующему:
1. Создание манифеста

Манифест - это xml-файл, который декларирует, что ваше приложение может использовать новые стили. Его можно создать блокнотом, сохранив текст в кодировке utf-8. Текст манифеста можно посмотреть на MSDN, изменив только версию и название вашей программы (Microsoft рекомендует формат <НазваниеОрганизации.НазваниеПродукта.ИмяПриложения>). Впрочем, даже если вы оставите всё как есть, на работоспособности это не отразится.

Получившийся файл можно сохранить рядом с запускаемым файлом, дав ему имя <полное имя запускаемого файла>.manifest. Например, если запускаемый файл называется HelloWorld.exe, файл манифеста надо назвать HelloWorld.exe.manifest и сохранить в той же папке, что и HelloWorld.exe. Вместо этого файл манифеста можно добавить в ресурсы, указав тип ресурса как RT_MANIFEST.

2. Модификация приложения

Нужно внести небольшие изменения в ваше приложение, а именно вызвать функцию InitCommonControls из библиотеки ComCtl32.dll.

Ниже находятся подробные инструкции для некоторых IDE, в которых вы можете столкнуться с этой проблемой.

a) C++ Builder 6

В новых RAD (RAD XE, RAD XE2 и т.д.) от вас не потребуется никаких действий. Сказанное ниже относится именно к шестому билдеру. Думаю, в Delphi 5 всё то же самое, хотя не проверял.

1. Создаём в папке проекта файл XPStyle.manifest следующего содержания:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>   
  2. <assembly   
  3. xmlns="urn:schemas-microsoft-com:asm.v1"   
  4. manifestVersion="1.0">   
  5. <assemblyIdentity   
  6. name="НАЗВАНИЕ ВАШЕЙ ПРОГРАММЫ"   
  7.    processorArchitecture="x86"   
  8.    version="1.0.0.0"   
  9.    type="win32"/>   
  10. <description>Executable</description>   
  11. <dependency>   
  12.    <dependentAssembly>   
  13.        <assemblyIdentity   
  14.            type="win32"   
  15.            name="Microsoft.Windows.Common-Controls"   
  16.            version="6.0.0.0"   
  17.            processorArchitecture="x86"   
  18.            publicKeyToken="6595b64144ccf1df"   
  19.            language="*"   
  20.        />   
  21.    </dependentAssembly>   
  22. </dependency>   
  23. </assembly>


2. Создаём рядом файл XPStyle.rc следующего содержания:

  1. 1 RT_MANIFEST "XPStyle.manifest"


Файл .rc - файл ресурсов. Здесь единица указывает номер ресурса (то есть можно поставить любую другую цифру). RT_MANIFEST - макрос из winuser.h, указывающий тип ресурса. Если компилятор вдруг начнёт ругаться, что не знает RT_MANIFEST, можно напрямую указать вместо него MAKEINTRESOURCE(24).

3. Добавляем оба файла в проект.

4. Пересобираем проект. Радуемся.

Будьте готовы к тому, что перерисованы будут только стандартные (для WinAPI) элементы. В частности, кнопки TSpeedButton и TBitBtn так и останутся прямоугольными. Можно сделать их flat, будет смотреться не так жутко.


b) WinAPI, Code::Blocks

Здесь всё просто. Все нужные файлы будут созданы плагином.

1. Plugins > WindowsXP Look'n'feel

От вас требуется только инициализировать библиотеку элементов управления:

2. В опциях линкера добавляем библиотеку libcomctl32.a

3. Добавляем в WinMain инициализацию библиотеки:

  1. int WINAPI WinMain (HINSTANCE hThisInstance,  
  2.                    HINSTANCE hPrevInstance,  
  3.                    LPSTR lpszArgument,  
  4.                    int nCmdShow)  
  5. {  
  6.   /* ... */  
  7.   InitCommonControls(); 


4. Не забываем



Если вдруг после этого не заработает, можно попробовать тёмное шаманство, - открыть манифест блокнотом и удалить все переносы, так, чтобы весь манифест был записан в одну строчку.

c) Microsoft Visual C++

Project > Properties > Linker > Manifest File
Additional Manifest Dependencies:

  1. type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'