Auf dieser Seite

Beispiel für einen Registerkarten-Dialog

Das Beispiel „Dialogfeld mit Registerkarten“ zeigt, wie man mithilfe der Klasse „ QTabWidget “ ein Dialogfeld mit Registerkarten erstellt.

Dialogfelder bieten eine effiziente Möglichkeit für die Anwendung, mit dem Benutzer zu kommunizieren, doch komplexe Dialogfelder haben oft den Nachteil, dass sie zu viel Platz auf dem Bildschirm einnehmen. Durch die Verwendung mehrerer Registerkarten in einem Dialogfeld lassen sich Informationen in verschiedene Kategorien unterteilen, ohne dass der Zugriff darauf eingeschränkt wird.

Dateiinformationen auf verschiedenen Registerkarten

Das Beispiel „Tab-Dialog“ besteht aus einer einzigen „ TabDialog “-Klasse, die drei Registerkarten bereitstellt, von denen jede Informationen zu einer bestimmten Datei enthält, sowie zwei Standard-Drucktasten, mit denen der Inhalt des Dialogs akzeptiert oder abgelehnt werden kann.

Definition der Klasse „TabDialog“

Die Klasse „ TabDialog “ ist eine Unterklasse von „ QDialog “, die ein „ QTabWidget “ und zwei Standard-Dialogschaltflächen anzeigt. Die Klassendefinition enthält lediglich den Klassenkonstruktor und ein privates Datenelement für das „ QTabWidget “:

class TabDialog : public QDialog
{
    Q_OBJECT

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

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

Im Beispiel wird das Widget als Fenster der obersten Ebene verwendet, aber wir definieren den Konstruktor so, dass er ein übergeordnetes Widget entgegennehmen kann. Dadurch kann der Dialog zentriert über dem Hauptfenster einer Anwendung angezeigt werden.

Implementierung der Klasse „TabDialog“

Der Konstruktor ruft den Konstruktor „ QDialog “ auf und erstellt ein „ QFileInfo “-Objekt für den angegebenen Dateinamen.

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"));

Das Registerkarten-Widget wird mit drei benutzerdefinierten Widgets gefüllt, die jeweils Informationen über die Datei enthalten. Wir erstellen jedes dieser Widgets ohne übergeordnetes Widget, da das Registerkarten-Widget ihnen beim Hinzufügen ein neues übergeordnetes Widget zuweist.

Wir erstellen zwei Standard-Druckknöpfe und verbinden jeden von ihnen mit den entsprechenden Slots im Dialog:

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

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

Wir ordnen das Tab-Widget im Dialogfeld über den Schaltflächen an:

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

Abschließend legen wir den Titel des Dialogs fest:

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

Jede der Registerkarten ist eine Unterklasse von „ QWidget “ und stellt lediglich Konstruktoren bereit.

Klassendefinition von `GeneralTab`

Die Definition des „GeneralTab“-Widgets ist einfach, da wir lediglich daran interessiert sind, den Inhalt eines Widgets innerhalb einer Registerkarte anzuzeigen:

class GeneralTab : public QWidget
{
    Q_OBJECT

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

Implementierung der Klasse „GeneralTab“

Das „GeneralTab“-Widget zeigt lediglich einige Informationen zu der vom „TabDialog“ übergebenen Datei an. Zu diesem Zweck stehen verschiedene Widgets zur Verfügung, die in einem vertikalen Layout angeordnet sind:

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);
}

Definition der Klasse „PermissionsTab“

Wie das „GeneralTab“-Widget dient auch das „PermissionsTab“-Widget lediglich als Platzhalter für seine untergeordneten Elemente:

class PermissionsTab : public QWidget
{
    Q_OBJECT

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

Implementierung der Klasse „PermissionsTab“

Das „PermissionsTab“ zeigt Informationen zu den Zugriffsrechten der Datei an und stellt Details zu den Dateiberechtigungen und dem Eigentümer in Widgets dar, die in verschachtelten Layouts angeordnet sind:

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);
}

Definition der Klasse „ApplicationsTab“

„ApplicationsTab“ ist ein weiteres Platzhalter-Widget, das hauptsächlich kosmetischen Zwecken dient:

class ApplicationsTab : public QWidget
{
    Q_OBJECT

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

Implementierung der „ApplicationsTab“-Klasse

Das „ApplicationsTab“ zeigt keine nützlichen Informationen an, könnte aber als Vorlage für ein komplexeres Beispiel dienen:

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);
}

Beispielprojekt @ 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.