Ejemplo de diálogo de pestaña
El ejemplo de diálogo de pestaña muestra cómo construir un diálogo de pestaña utilizando la clase QTabWidget.
Los cuadros de diálogo son una forma eficaz de que la aplicación se comunique con el usuario, pero los cuadros de diálogo complejos tienen el problema de que suelen ocupar demasiada pantalla. Mediante el uso de un número de pestañas en un diálogo, la información puede ser dividida en diferentes categorías, sin dejar de ser accesible.

El ejemplo de Tab Dialog consiste en una única clase TabDialog que proporciona tres pestañas, cada una de las cuales contiene información sobre un archivo concreto, y dos botones estándar que se utilizan para aceptar o rechazar el contenido del diálogo.
Definición de la clase TabDialog
La clase TabDialog es una subclase de QDialog que muestra una QTabWidget y dos botones de diálogo estándar. La definición de la clase sólo contiene el constructor de la clase y un miembro de datos privado para el QTabWidget:
class TabDialog : public QDialog { Q_OBJECT public: explicit TabDialog(const QString &fileName, QWidget *parent = nullptr); private: QTabWidget *tabWidget; QDialogButtonBox *buttonBox; };
En el ejemplo, el widget se utilizará como una ventana de nivel superior, pero definimos el constructor para que pueda tomar un widget padre. Esto permite centrar el diálogo encima de la ventana principal de una aplicación.
Implementación de la Clase TabDialog
El constructor llama al constructor QDialog y crea un objeto QFileInfo para el nombre de archivo especificado.
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"));
El widget de la pestaña se rellena con tres widgets personalizados que contienen información sobre el archivo. Construimos cada uno de ellos sin un widget padre porque el widget de la pestaña los reasignará a medida que se le añadan.
Creamos dos botones estándar y conectamos cada uno de ellos a las ranuras correspondientes del cuadro de diálogo:
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
Colocamos el widget de pestañas encima de los botones del cuadro de diálogo:
QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addWidget(buttonBox); setLayout(mainLayout);
Por último, establecemos el título del cuadro de diálogo:
setWindowTitle(tr("Tab Dialog"));
}Cada una de las pestañas son subclases de QWidget, y sólo proporcionan constructores.
Definición de la clase GeneralTab
La definición del widget GeneralTab es simple porque sólo estamos interesados en mostrar el contenido de un widget dentro de una pestaña:
class GeneralTab : public QWidget { Q_OBJECT public: explicit GeneralTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
Implementación de la clase GeneralTab
El widget GeneralTab simplemente muestra alguna información sobre el archivo pasado por el TabDialog. Hay varios widgets para este propósito, y estos están dispuestos dentro de un diseño vertical:
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); }
Definición de la Clase PermissionsTab
Al igual que la GeneralTab, la PermissionsTab se utiliza simplemente como un widget marcador de posición para sus hijos:
class PermissionsTab : public QWidget { Q_OBJECT public: explicit PermissionsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
Implementación de la clase PermissionsTab
La PermissionsTab muestra información sobre el acceso al archivo, mostrando detalles de los permisos del archivo y el propietario en widgets que están dispuestos en diseños anidados:
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); }
Definición de la Clase ApplicationsTab
La ApplicationsTab es otro widget marcador de posición que es principalmente cosmético:
class ApplicationsTab : public QWidget { Q_OBJECT public: explicit ApplicationsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
Implementación de la Clase ApplicationsTab
La ApplicationsTab no muestra ninguna información útil, pero podría usarse como plantilla para un ejemplo más complicado:
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); }
© 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.