标签对话框示例
标签对话框示例展示了如何使用 QTabWidget 类来构建标签对话框。
对话框为应用程序与用户进行沟通提供了一种有效的方式,但复杂的对话框往往占用了太多的屏幕区域。通过在对话框中使用多个标签,可以将信息分成不同的类别,同时保持可访问性。
标签对话框示例由一个单独的 TabDialog
类组成,该类提供三个标签,每个标签包含有关特定文件的信息,以及两个标准的推送按钮,这些按钮用于接受或拒绝对话框中的内容。
TabDialog 类定义
TabDialog
类是 QDialog 的一个子类,它显示了一个 QTabWidget 和两个标准的对话框按钮。类定义只包含了类构造函数和 QTabWidget 的私有数据成员
class TabDialog : public QDialog { Q_OBJECT public: explicit TabDialog(const QString &fileName, QWidget *parent = nullptr); private: QTabWidget *tabWidget; QDialogButtonBox *buttonBox; };
在示例中,小部件将用作顶级窗口,但我们将构造函数定义为可以接受父部件。这使得可以将对话框置于应用程序主窗口之上并居中。
TabDialog 类实现
构造函数调用了 QDialog 构造函数并为指定的文件名创建了一个 QFileInfo 对象。
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"));
标签小部件被填充了三个自定义小部件,每个小部件包含有关文件的信息。我们不需要父部件构建每个小部件,因为当小部件被添加到标签小部件时,它将重新父化它们。
我们创建了两个标准的推送按钮,并将每个按钮连接到对话框中合适的位置。
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
我们将标签小部件放置在对话框中按钮的上方。
QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addWidget(buttonBox); setLayout(mainLayout);
最后,我们设置了对话框的标题。
setWindowTitle(tr("Tab Dialog"));
}
每个标签都是从 QWidget 继承下来的,并且只提供构造函数。
GeneralTab 类定义
由于我们只对在一个标签内显示小部件的内容感兴趣,因此 GeneralTab 小部件的定义很简单。
class GeneralTab : public QWidget { Q_OBJECT public: explicit GeneralTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
GeneralTab 类实现
GeneralTab 小部件简单地显示了 TabDialog 传递的文件的一些信息。为此目的我们使用了各种小部件,并将它们 arrange 在一个垂直布局中。
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 类定义
与 GeneralTab 类似,PermissionsTab 也是一个用于其子部件的占位小部件。
class PermissionsTab : public QWidget { Q_OBJECT public: explicit PermissionsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
PermissionsTab 类实现
PermissionsTab 展示了有关文件访问信息的信息,下属小部件以嵌套布局的方式显示了文件权限和所有者详情。
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 类定义
ApplicationsTab 是另一个主要起装饰作用的占位符小部件
class ApplicationsTab : public QWidget { Q_OBJECT public: explicit ApplicationsTab(const QFileInfo &fileInfo, QWidget *parent = nullptr); };
ApplicationsTab 类实现
ApplicationsTab 不显示任何有用的信息,但可以作为更复杂示例的模板使用
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); }
© 2024 Qt 公司有限公司。本文件中包含的文档贡献者是各自版权的所有者。本文件提供的文档受 GNU 自由文档许可证版本 1.3 的条款约束,由自由软件基金会发布。Qt 及相关商标是 Qt 公司在芬兰和其他国家的商标。所有其他商标均属其各自所有者。