QMainWindow, QScrollArea et QLabel
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 » :
Code:
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}
) |
Fichier « mainboard.ui » :
Code:
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 » :
Code:
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 « mainboard.cpp » :
Code:
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());
}
} |
Fichier « main.cpp » :
Code:
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();
} |
Voilà, d’avance merci si vous avez une idée pour m’aider.
À bientôt.
Le Farfadet Spatial