aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-04-04 16:21:22 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-04-04 16:21:22 +0200
commit7219836b03f169f9ea69e4dfdf3f35dfdba80ab0 (patch)
tree782ef1a9d55d20fa03de55562b958e5f3f497e71 /src
parent111ca020e8a8bc480663afb62f2006e35b732320 (diff)
downloadsebastiano.tronto.net-7219836b03f169f9ea69e4dfdf3f35dfdba80ab0.tar.gz
sebastiano.tronto.net-7219836b03f169f9ea69e4dfdf3f35dfdba80ab0.zip
Added blog post
Diffstat (limited to 'src')
-rw-r--r--src/blog/2025-04-04-qt-minimal/qt-minimal.md100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/blog/2025-04-04-qt-minimal/qt-minimal.md b/src/blog/2025-04-04-qt-minimal/qt-minimal.md
new file mode 100644
index 0000000..6f112bb
--- /dev/null
+++ b/src/blog/2025-04-04-qt-minimal/qt-minimal.md
@@ -0,0 +1,100 @@
1# Getting started with QT, without the nonsense
2
3At work I have recently (yesterday) ended working on a big project and
4I am now waiting for a new assignment. While I wait, I decided that I
5should take some time to learn something that could be useful both at
6work and for my personal projects. After some thought, I settled on QT
7development with C++.
8
9Any tutorial on this topic tells you to start by downloading QT Creator,
10an full-blown IDE, and set up a new project from there. In a few clicks
11you'll have a couple of source code files and a CMakeLists.txt full of
12[CMake](https://nl.wikipedia.org/wiki/CMake) magic. Ready to go!
13
14But there is a problem. I don't like full-blown IDEs (although admittedly
15QT Creator seems quite snappy), and I don't like being locked into specific
16tools such as CMake. I tried to look online how to set up a QT project
17without these, but I could not find anything, so I had to figure it out on
18my own. And then I wrote this post so you don't have have to waste your
19time like I did :)
20
21You can find the source code for this tiny project
22[here](https://git.tronto.net/minimal-qt) (or
23[here](https://github.com/sebastianotronto/minimal-qt)) if you have bad
24tase and prefer github over my [self-hosted](../2022-11-23-git-host/)
25git instance. If you just want to try it out you can run, from the
26project's main folder:
27
28```
29make && run
30```
31
32But keep reading if you want to understand how this works!
33
34## Requirements
35
36* A C++ compiler (tested with GCC 14.2.1 and Clang 19.1.7, both on Linux-x86_64)
37* QT libraries and headers
38* The QT development tools `moc` and `uic`
39
40On Fedora Linux they are contained in the `qt6-qtbase-devel` package.
41I have not tested this on other operating systems.
42
43## Explanation
44
45Following the most basic QT Creator template, there are 4 source code files:
46
47* `main.cpp`: the main source file
48* `mainwindow.h`: the header file for the main window of the application
49* `mainwindow.cpp`: the C++ source for the main window
50* `mainwindow.ui`: the UI file with an XML description of the main window
51
52The compilation is done in 3 steps:
53
541. Pre-process `mainwindow.h` with `moc` to obtain `moc_mainwindow.cpp`
552. Compile `mainwindow.ui` with `uic` to obtain `ui_mainwindow.h`
563. Compile the C++ files, including `moc_mainwindow.cpp`
57
58The `Makefile` implements these three steps.
59
60The first two steps are straightforward: first you need to locate the
61`moc` and `uic` commands. They are usually in the QT installation
62folder - for example I have them in `/usr/lib64/qt/libexec`. Then run:
63
64```
65/usr/lib64/qt/libexec/moc mainwindow.h > moc_mainwindow.cpp
66/usr/lib64/qt/libexex/uic mainwindow.ui > ui_mainwindow.h
67```
68
69These steps can be skipped if one prefers to write the `moc_` and `ui_`
70files directly, removing the dependency on the two tools.
71
72For the last step, one needs to include the header files and link with
73the QT libraries.
74
75On my system the header files are in `/usr/include/qt6`. This means I
76need to add the option `-I /usr/include/qt6` to my `g++` command. This
77project also requires headers contained in a subfolder of this,
78so I will add a second `-I` option (see the full command below).
79
80As for the shared libraries, in my case they are installed in a system
81folder that is scanned by default by the linker, so I don't have to
82specify the path. We need the files `libQt6Widgets.so`, `libQt6Core.so`
83and `libQt6Gui.so`, which we can include with
84`-lQt6Widgets -lQt6Core -lQt6Gui`. If your linker does not find them,
85locate them and include their folder with `-L /path/to/the/folder`.
86
87So the command for step 3 becomes:
88
89```
90g++ main.cpp mainwindow.cpp moc_mainwindow.cpp \
91 -I /usr/include/qt6 -I /usr/include/qt6/QtWidgets \
92 -lQt6Widgets -lQt6Core -lQt6Gui
93 -o run
94```
95
96And finally you can enjoy your new app:
97
98```
99./run
100```

Generated with cgit - Back to sebastiano.tronto.net