Salut à tous !
Je suis plutôt un habitué de Gtkmm, mais en l’occurrence je lance un projet utilisant Qt. Le projet est codé principalement en C++ et j’utilise CMake pour le construire.
Une partie des traitements du code se font sur des images, j’ai donc besoin de fonctionnalités de bases d’un visualiseur d’image. Je me base donc sur l’exemple de la documentation de Qt. Toutefois, je réalise l’interface graphique à l’aide de Qt Designer pour générer des fichiers .ui, ce qui me semble être plus souple dans le développement.
Je réalise donc une QMainWindow. Dans sa zone centrale, je place une QScrollArea et dans cette dernière, je place un QLabel (qui servira donc à afficher l’image). Las ! J’ai eu beau manipuler les différentes propriétés accessibles dans Qt Designer, à chaque fois la QScrollArea est perdue dans la zone centrale sans s’y étendre, de même que le QLabel est perdu dans la QScrollArea sans s’y étendre. Le résultat est que seule une partie de l’image apparaît et qu’aucun barre de défilement n’est présente. J’ai tenté d’utiliser des layouts, mais ça n’a rien donné.
Bon, quelque chose m’échappe, mais je n’arrive pas à trouver quoi, même en cherchant dans la documentation.
Pour l’instant, j’ai une version qui fonctionne comme attendu et que je vous présente en fin de ce message, mais je ne crée rien dans la zone centrale à l’aide de Qt Designer : je le fais à la main dans le code. Cela ne me semble pas la meilleure méthode. Je me demande donc qu’elles sont les propriétés que j’ai ratées qui doivent m’amener au résultat escompté.
Pour que l’aide soit plus aisée, j’ai repris mon code, enlevé toute autre dépendance que Qt, supprimé l’essentiel des commentaires Doxygen et tout placé dans un unique répertoire. Donc, normalement la compilation est simple et il n’y a que ce qui est nécessaire.
Fichier « CMakeLists.txt » :
Fichier « mainboard.ui » :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 cmake_minimum_required(VERSION 2.6) project(GeoDesk CXX) # Path for the executable. set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE}) # Name of the executable. set(EXECUTABLE_NAME geodesk) include_directories(${PROJECT_BINARY_DIR}) find_package(Qt4 REQUIRED) set( SOURCE_FILES main.cpp mainboard.cpp ) set( QT_HEADER_FILES mainboard.hpp ) QT4_WRAP_CPP(QT_HEADERS_MOC ${QT_HEADER_FILES}) set ( QT_FORM_FILES mainboard.ui ) QT4_WRAP_UI(QT_FORM_HEADERS ${QT_FORM_FILES}) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) add_executable( ${EXECUTABLE_NAME} ${SOURCE_FILES} ${QT_HEADERS_MOC} ${QT_FORM_HEADERS} ) target_link_libraries( ${EXECUTABLE_NAME} ${QT_LIBRARIES} )
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainBoard</class> <widget class="QMainWindow" name="MainBoard"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>GeoDesk</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>29</height> </rect> </property> <widget class="QMenu" name="menuFile"> <property name="title"> <string>&File</string> </property> <addaction name="actionOpen"/> <addaction name="separator"/> <addaction name="actionQuit"/> </widget> <addaction name="menuFile"/> </widget> <widget class="QStatusBar" name="statusbar"/> <action name="actionOpen"> <property name="text"> <string>&Open</string> </property> <property name="toolTip"> <string>Open an image</string> </property> <property name="shortcut"> <string>Ctrl+O</string> </property> </action> <action name="actionQuit"> <property name="text"> <string>&Quit</string> </property> <property name="toolTip"> <string>Quit GeoDesk</string> </property> <property name="shortcut"> <string>Ctrl+Q</string> </property> </action> </widget> <resources/> <connections> <connection> <sender>actionQuit</sender> <signal>activated()</signal> <receiver>MainBoard</receiver> <slot>close()</slot> <hints> <hint type="sourcelabel"> <x>-1</x> <y>-1</y> </hint> <hint type="destinationlabel"> <x>399</x> <y>299</y> </hint> </hints> </connection> </connections> </ui>
Fichier « mainboard.hpp » :
Fichier « mainboard.cpp » :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 #ifndef MAINBOARD_HPP #define MAINBOARD_HPP #include <QtGui> #include <QWidget> #include <QLabel> #include <QMenu> #include <QApplication> #include <QString> #include "ui_mainboard.h" /// \brief Namespace for GUI definition. namespace GUI { class MainBoard: public QMainWindow { Q_OBJECT public: /// \brief Default constructor. explicit MainBoard (): QMainWindow () { ui.setupUi(this); imageLabel = new QLabel; imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); imageLabel->setScaledContents(true); scrollArea = new QScrollArea; scrollArea->setWidget(imageLabel); setCentralWidget(scrollArea); } /// \brief Destructor. virtual ~MainBoard () { delete imageLabel; delete scrollArea; } protected slots: /// \brief Get the name of the file to be opened. void on_actionOpen_triggered (); private: /// \brief Image scale factor. double scaleFactor; /// \brief Name of the file to be opened. QString fileName; /// \brief Label for image manipulation. QLabel* imageLabel; /// \brief Allows to scroll in the image. QScrollArea* scrollArea; /// \brief Get the GUI description. Ui::MainBoard ui; }; } #endif // #ifndef MAINBOARD_HPP
Fichier « main.cpp » :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <QFileDialog> #include <QString> #include <QLabel> #include <QPixmap> #include <QImage> #include <QMessageBox> #include "mainboard.hpp" /* -- Open an image. ------------------------------------------------------ */ void GUI::MainBoard::on_actionOpen_triggered () { fileName = QFileDialog::getOpenFileName(this, tr("Open file"), QDir::currentPath()); if (!fileName.isEmpty()) { const QImage image (fileName); if (image.isNull()) { QMessageBox::information(this, tr("GeoDesk"), tr("Cannot load %1.").arg(fileName)); return; } imageLabel->setPixmap(QPixmap::fromImage(image)); scaleFactor = 1.0; imageLabel->resize(imageLabel->pixmap()->size()); } }
Voilà, d’avance merci si vous avez une idée pour m’aider.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <QApplication> #include "mainboard.hpp" int main (int argc, char** argv) { /* Initialisation of Qt. */ const QApplication app (argc, argv); /* Main board of the program. */ GUI::MainBoard mainBoard; mainBoard.show(); return app.exec(); }
À bientôt.
Le Farfadet Spatial
Partager