Sur cette page

Exemple de boîte de dialogue à onglets

L'exemple de boîte de dialogue à onglets montre comment créer une boîte de dialogue à onglets à l'aide de la classe ` QTabWidget `.

Les boîtes de dialogue constituent un moyen efficace pour l'application de communiquer avec l'utilisateur, mais les boîtes de dialogue complexes présentent l'inconvénient de souvent occuper trop d'espace à l'écran. L'utilisation de plusieurs onglets dans une boîte de dialogue permet de répartir les informations en différentes catégories, tout en les rendant accessibles.

Informations sur les fichiers dans différents onglets

L'exemple de boîte de dialogue à onglets se compose d'une seule classe ` TabDialog ` qui fournit trois onglets, chacun contenant des informations sur un fichier particulier, ainsi que deux boutons standard permettant d'accepter ou de rejeter le contenu de la boîte de dialogue.

Définition de la classe `TabDialog`

La classe ` TabDialog ` est une sous-classe de ` QDialog ` qui affiche une ` QTabWidget ` et deux boutons de dialogue standard. La définition de la classe ne contient que le constructeur de la classe et un membre de données privé pour l’ QTabWidget:

class TabDialog : public QDialog
{
    Q_OBJECT

public:
    explicit TabDialog(const QString &fileName, QWidget *parent = nullptr);

private:
    QTabWidget *tabWidget;
    QDialogButtonBox *buttonBox;
};

Dans l’exemple, le widget sera utilisé comme une fenêtre de niveau supérieur, mais nous définissons le constructeur de manière à ce qu’il puisse accepter un widget parent. Cela permet de centrer la boîte de dialogue au-dessus de la fenêtre principale d’une application.

Implémentation de la classe TabDialog

Le constructeur appelle le constructeur ` QDialog ` et crée un objet ` QFileInfo ` pour le nom de fichier spécifié.

TabDialog::TabDialog(const QString &fileName, QWidget *parent)
    : QDialog(parent)
{
    QFileInfo fileInfo(fileName);

    tabWidget = new QTabWidget;
    tabWidget->addTab(new GeneralTab(fileInfo), tr("General"));
    tabWidget->addTab(new PermissionsTab(fileInfo), tr("Permissions"));
    tabWidget->addTab(new ApplicationsTab(fileInfo), tr("Applications"));

Le widget d’onglet est rempli de trois widgets personnalisés contenant chacun des informations sur le fichier. Nous construisons chacun d’entre eux sans widget parent, car le widget d’onglet leur attribuera un nouveau parent au fur et à mesure qu’ils y seront ajoutés.

Nous créons deux boutons standard et connectons chacun d’eux aux slots appropriés de la boîte de dialogue :

    buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
                                     | QDialogButtonBox::Cancel);

    connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
    connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);

Nous plaçons le widget d'onglets au-dessus des boutons dans la boîte de dialogue :

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(tabWidget);
    mainLayout->addWidget(buttonBox);
    setLayout(mainLayout);

Enfin, nous définissons le titre de la boîte de dialogue :

    setWindowTitle(tr("Tab Dialog"));
}

Chacun des onglets est une sous-classe de ` QWidget` et ne fournit que des constructeurs.

Définition de la classe GeneralTab

La définition du widget GeneralTab est simple, car nous souhaitons uniquement afficher le contenu d’un widget au sein d’un onglet :

class GeneralTab : public QWidget
{
    Q_OBJECT

public:
    explicit GeneralTab(const QFileInfo &fileInfo, QWidget *parent = nullptr);
};

Implémentation de la classe GeneralTab

Le widget GeneralTab affiche simplement des informations sur le fichier transmis par TabDialog. Divers widgets sont utilisés à cette fin et sont disposés selon une mise en page verticale :

GeneralTab::GeneralTab(const QFileInfo &fileInfo, QWidget *parent)
    : QWidget(parent)
{
    QLabel *fileNameLabel = new QLabel(tr("File Name:"));
    QLineEdit *fileNameEdit = new QLineEdit(fileInfo.fileName());

    QLabel *pathLabel = new QLabel(tr("Path:"));
    QLabel *pathValueLabel = new QLabel(fileInfo.absoluteFilePath());
    pathValueLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

    QLabel *sizeLabel = new QLabel(tr("Size:"));
    qlonglong size = fileInfo.size()/1024;
    QLabel *sizeValueLabel = new QLabel(tr("%1 K").arg(size));
    sizeValueLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

    QLabel *lastReadLabel = new QLabel(tr("Last Read:"));
    QLabel *lastReadValueLabel = new QLabel(fileInfo.lastRead().toString());
    lastReadValueLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

    QLabel *lastModLabel = new QLabel(tr("Last Modified:"));
    QLabel *lastModValueLabel = new QLabel(fileInfo.lastModified().toString());
    lastModValueLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(fileNameLabel);
    mainLayout->addWidget(fileNameEdit);
    mainLayout->addWidget(pathLabel);
    mainLayout->addWidget(pathValueLabel);
    mainLayout->addWidget(sizeLabel);
    mainLayout->addWidget(sizeValueLabel);
    mainLayout->addWidget(lastReadLabel);
    mainLayout->addWidget(lastReadValueLabel);
    mainLayout->addWidget(lastModLabel);
    mainLayout->addWidget(lastModValueLabel);
    mainLayout->addStretch(1);
    setLayout(mainLayout);
}

Définition de la classe PermissionsTab

Tout comme GeneralTab, PermissionsTab sert simplement de widget de remplacement pour ses enfants :

class PermissionsTab : public QWidget
{
    Q_OBJECT

public:
    explicit PermissionsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr);
};

Implémentation de la classe PermissionsTab

La classe PermissionsTab affiche des informations relatives aux droits d'accès du fichier, en présentant les détails des permissions et du propriétaire du fichier dans des widgets organisés selon des mises en page imbriquées :

PermissionsTab::PermissionsTab(const QFileInfo &fileInfo, QWidget *parent)
    : QWidget(parent)
{
    QGroupBox *permissionsGroup = new QGroupBox(tr("Permissions"));

    QCheckBox *readable = new QCheckBox(tr("Readable"));
    if (fileInfo.isReadable())
        readable->setChecked(true);

    QCheckBox *writable = new QCheckBox(tr("Writable"));
    if ( fileInfo.isWritable() )
        writable->setChecked(true);

    QCheckBox *executable = new QCheckBox(tr("Executable"));
    if ( fileInfo.isExecutable() )
        executable->setChecked(true);

    QGroupBox *ownerGroup = new QGroupBox(tr("Ownership"));

    QLabel *ownerLabel = new QLabel(tr("Owner"));
    QLabel *ownerValueLabel = new QLabel(fileInfo.owner());
    ownerValueLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

    QLabel *groupLabel = new QLabel(tr("Group"));
    QLabel *groupValueLabel = new QLabel(fileInfo.group());
    groupValueLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

    QVBoxLayout *permissionsLayout = new QVBoxLayout;
    permissionsLayout->addWidget(readable);
    permissionsLayout->addWidget(writable);
    permissionsLayout->addWidget(executable);
    permissionsGroup->setLayout(permissionsLayout);

    QVBoxLayout *ownerLayout = new QVBoxLayout;
    ownerLayout->addWidget(ownerLabel);
    ownerLayout->addWidget(ownerValueLabel);
    ownerLayout->addWidget(groupLabel);
    ownerLayout->addWidget(groupValueLabel);
    ownerGroup->setLayout(ownerLayout);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(permissionsGroup);
    mainLayout->addWidget(ownerGroup);
    mainLayout->addStretch(1);
    setLayout(mainLayout);
}

Définition de la classe ApplicationsTab

ApplicationsTab est un autre widget de remplacement qui a surtout une fonction esthétique :

class ApplicationsTab : public QWidget
{
    Q_OBJECT

public:
    explicit ApplicationsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr);
};

Implémentation de la classe ApplicationsTab

La classe ApplicationsTab n'affiche aucune information utile, mais pourrait servir de modèle pour un exemple plus complexe :

ApplicationsTab::ApplicationsTab(const QFileInfo &fileInfo, QWidget *parent)
    : QWidget(parent)
{
    QLabel *topLabel = new QLabel(tr("Open with:"));

    QListWidget *applicationsListBox = new QListWidget;
    QStringList applications;

    for (int i = 1; i <= 30; ++i)
        applications.append(tr("Application %1").arg(i));
    applicationsListBox->insertItems(0, applications);

    QCheckBox *alwaysCheckBox;

    if (fileInfo.suffix().isEmpty())
        alwaysCheckBox = new QCheckBox(tr("Always use this application to "
            "open this type of file"));
    else
        alwaysCheckBox = new QCheckBox(tr("Always use this application to "
            "open files with the extension '%1'").arg(fileInfo.suffix()));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(topLabel);
    layout->addWidget(applicationsListBox);
    layout->addWidget(alwaysCheckBox);
    setLayout(layout);
}

Exemple de projet sur code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.