Beispiel für einen Tabulator-Dialog
Das Beispiel für den Tabulator-Dialog zeigt, wie man einen Tabulator-Dialog mit der Klasse QTabWidget erstellt.
Dialoge bieten eine effiziente Möglichkeit für die Anwendung, mit dem Benutzer zu kommunizieren, aber komplexe Dialoge haben das Problem, dass sie oft zu viel Bildschirmfläche beanspruchen. Durch die Verwendung einer Reihe von Registerkarten in einem Dialog können Informationen in verschiedene Kategorien aufgeteilt werden, während sie gleichzeitig zugänglich bleiben.
Das Beispiel TabDialog besteht aus einer einzigen Klasse TabDialog
, die drei Registerkarten mit Informationen zu einer bestimmten Datei und zwei Standarddrucktasten zum Annehmen oder Ablehnen des Dialogs enthält.
TabDialog-Klassendefinition
Die Klasse TabDialog
ist eine Unterklasse von QDialog, die ein QTabWidget und zwei Standard-Dialogschaltflächen anzeigt. Die Klassendefinition enthält nur den Klassenkonstruktor und ein privates Datenmitglied für die QTabWidget:
class TabDialog : public QDialog { Q_OBJECT public: explicit TabDialog(const QString &fileName, QWidget *parent = nullptr); private: QTabWidget *tabWidget; QDialogButtonBox *buttonBox; };
In diesem Beispiel wird das Widget als Fenster der obersten Ebene verwendet, aber wir definieren den Konstruktor so, dass er ein übergeordnetes Widget annehmen kann. Dadurch kann das Dialogfeld über dem Hauptfenster einer Anwendung zentriert werden.
Implementierung der TabDialog-Klasse
Der Konstruktor ruft den QDialog Konstruktor 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 Tab-Widget wird mit drei benutzerdefinierten Widgets gefüllt, die jeweils Informationen über die Datei enthalten. Wir erstellen jedes dieser Widgets ohne ein übergeordnetes Widget, da das Registerkarten-Widget sie repariert, wenn sie ihm hinzugefügt werden.
Wir erstellen zwei Standard-Drucktasten und verbinden jede 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 Registerkarten-Widget oberhalb der Schaltflächen im Dialogfeld an:
QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addWidget(buttonBox); setLayout(mainLayout);
Schließlich setzen wir den Titel des Dialogs:
setWindowTitle(tr("Tab Dialog"));
}
Jede der Registerkarten ist eine Unterklasse von QWidget und bietet nur Konstruktoren.
Definition der Klasse GeneralTab
Die Definition des Widgets GeneralTab ist einfach, da wir nur daran interessiert sind, den Inhalt eines Widgets innerhalb einer Registerkarte darzustellen:
class GeneralTab : public QWidget { Q_OBJECT public: explicit GeneralTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
Implementierung der Klasse GeneralTab
Das GeneralTab-Widget zeigt einfach einige Informationen über die vom TabDialog übergebene Datei an. Zu diesem Zweck gibt es verschiedene Widgets, 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); }
PermissionsTab Klassendefinition
Wie das GeneralTab wird das PermissionsTab nur als Platzhalter-Widget für seine Kinder verwendet:
class PermissionsTab : public QWidget { Q_OBJECT public: explicit PermissionsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
PermissionsTab-Klassenimplementierung
Die PermissionsTab zeigt Informationen über die Zugriffsinformationen der Datei an, indem sie Details zu den Dateiberechtigungen und dem Eigentümer in Widgets anzeigt, 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); }
ApplicationsTab Klassendefinition
Die ApplicationsTab ist ein weiteres Platzhalter-Widget, das hauptsächlich kosmetischen Charakter hat:
class ApplicationsTab : public QWidget { Q_OBJECT public: explicit ApplicationsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
ApplicationsTab-Klassenimplementierung
Die ApplicationsTab zeigt keine nützlichen Informationen an, kann aber als Vorlage für ein komplizierteres Beispiel verwendet werden:
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); }
© 2025 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.