Qt: Difference between revisions

imported>Tobias.bora
No edit summary
m Fix syntax error in example code for specifying explitit Qt dependencies
 
(5 intermediate revisions by 2 users not shown)
Line 10: Line 10:


For using direnv, create a '''shell.nix''' file in the root of your project and paste these lines into it:
For using direnv, create a '''shell.nix''' file in the root of your project and paste these lines into it:
<syntaxHighlight lang=nix>
<syntaxHighlight lang=nix>
# shell.nix
# shell.nix
Line 27: Line 28:
Happy qt coding :)
Happy qt coding :)


=== Explicit Dependencies ===
However if fetching the entirety of <code>pkgs.qt6.full</code> is not appealing and you know which parts of Qt you need, your first instinct might be adding something like <code>pkgs.qt6.qtdeclarative</code> for creating QML-based Qt programs to <code>buildInputs</code>, '''however''' that will not work and you will get compile errors for missing libraries. <code>pkgs.qt6.full</code> is actually [https://github.com/NixOS/nixpkgs/blob/nixos-24.11/pkgs/development/libraries/qt-6/default.nix#L94-L144 creating an environment that contains all Qt libraries] that allows <code>qmake</code> and tools to find those libraries, so you must do the same and <code>pkgs.qt6.env</code> will help make one. For example:
<syntaxhighlight lang="nix">
# shell.nix
{ pkgs ? import <nixpkgs> {} }:
let
  # pkgs.qt6.env already includes pkgs.qt6.qtbase
  # And using `with` to prevent a lot of typing.
  qtEnv = with pkgs.qt6; env "qt-custom-${qtbase.version}" [
    qtdeclarative
  ];
in
  pkgs.mkShell {
    buildInputs = [
      qtEnv
      # pkgs.qt6.qtdeclarative depends on pkgs.libglvnd
      # Also worth noting it could be in qtEnv if preferred for "relatedness" reasons
      pkgs.libglvnd
      pkgs.qtcreator
    ];
}
</syntaxhighlight>


== Packaging ==
== Packaging ==
Line 163: Line 188:
* [https://stackoverflow.com/questions/18663331 How to check the selected version of Qt in a .pro file?]
* [https://stackoverflow.com/questions/18663331 How to check the selected version of Qt in a .pro file?]


== Deal with QML files ==
== Hello world involving QML, Qt5, nix and cmake, qmake or meson ==


You can find [https://gist.github.com/tobiasBora/04d0febda0b3f09707b5e1b7b85390a5 here] a minimal example to use QML, cmake, nix and Qt5. There is nothing special to nix there, but note that if you provide the qml file using something like <code>qrc:///main.qml</code>, then you need to write a qrc file that lists all the resources that must be included in the qt resource manager. This file is then used to compile the resources and include them in the binary (you have to compile the binaries, either automatically with cmake or qmake, or manually using rcc). With cmake you compile it using <code>qt5_add_resources(SOURCES qml.qrc)</code> ([https://doc.qt.io/qt-5/qtcore-cmake-qt5-add-resources.html doc]) as illustrated in the above example (make sure to use a variable as the source and to reuse the same variable in <code>add_executable</code>).
You can find [https://gist.github.com/tobiasBora/04d0febda0b3f09707b5e1b7b85390a5 here] a minimal example to use QML, cmake, nix and Qt5, and [https://gist.github.com/tobiasBora/6f114cca1affb5528c872ca01d7e28c1 here] is the same example with qmake instead and [https://gist.github.com/tobiasBora/812701e8741814393f3df7b23a11eb4b here] is the same with meson instead. There is nothing special to nix there, but note that if you provide the qml file using something like <code>qrc:///main.qml</code>, then you need to write a qrc file that lists all the resources that must be included in the qt resource manager. This file is then used to compile the resources and include them in the binary (you have to compile the binaries, either automatically with cmake or qmake, or manually using rcc). With cmake you compile it using <code>qt5_add_resources(SOURCES qml.qrc)</code> ([https://doc.qt.io/qt-5/qtcore-cmake-qt5-add-resources.html doc]) as illustrated in the above example (make sure to use a variable as the source and to reuse the same variable in <code>add_executable</code>).