Tab Dialog例子展示怎么使用QTabWidget构造一个标签对话框。
本例由一个TabDialog类组成,它提供了三个标签栏,每一个都包含了有关打开文件的信息,还提供了两个标准按钮,用于accept和reject对话框的内容。
QTabWidget类提供一个栈型的标签组件。它提供一个QTabBar和一个“页区域(page area)”它用来展示每页中相关的标签。默认地tab bar是被显示在页区域上的。
通常使用QTabWidget是这么做的:
1. 创建一个QTableWidget
2. 为在tab dialog中的每一页创建一个QWidget,但是不要指定父widget。
3. 插入子widgets到页Widget,用layout给他们布局
4. 调用addTab()或者insertTab()将页widget放到标签widget,给每一个标签一个适合的带有快捷键的label 。
当选中一个页时就会发送信号currentChanged();当前页的索引:currentIndex();当前页widget:currentWidget;可以使用widget(index)来返回对应索引的widget指针;也可以用indexOf()查找索引位置的widget。可以通过setTabText(),setTabIcon设置标签的文本和图标,可也以用removeTab(index)删除掉索引的标签。
下面看代码:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QString fileName; if (argc >= 2) // 如果传递参数,就打开这个传递过来的参数(文件) fileName = argv[1]; else fileName = "."; TabDialog tabdialog(fileName); // 将fileName传给tabdialog实例 #ifdef Q_OS_SYMBIAN tabdialog.showMaximized(); #else tabdialog.show(); #endif return app.exec(); }
程序的打开文件信息有参数提供,那么我们可以用控制台终端去指定:
***>tabdialog file.txt
也可以用拖放的方法,将要打开的文件拖放到tabdialog.exe的图标上去。
//! [0] // 为Tab Dialog创建的页Widget class GeneralTab : public QWidget { Q_OBJECT public: GeneralTab(const QFileInfo &fileInfo, QWidget *parent = 0); }; //! [0] //! [1] // 为Tab Dialog创建的页Widget class PermissionsTab : public QWidget { Q_OBJECT public: PermissionsTab(const QFileInfo &fileInfo, QWidget *parent = 0); }; //! [1] //! [2] // 为Tab Dialog创建的页Widget class ApplicationsTab : public QWidget { Q_OBJECT public: ApplicationsTab(const QFileInfo &fileInfo, QWidget *parent = 0); }; //! [2] //! [3] // 标签对话框,一个QTabWidget,一个QDialogButtonBox class TabDialog : public QDialog { Q_OBJECT public: TabDialog(const QString &fileName, QWidget *parent = 0); private: QTabWidget *tabWidget; QDialogButtonBox *buttonBox; }; //! [3]
//! [0] TabDialog::TabDialog(const QString &fileName, QWidget *parent) : QDialog(parent) { QFileInfo fileInfo(fileName); // 文件信息 tabWidget = new QTabWidget; // 创建QTabWidget tabWidget->addTab(new GeneralTab(fileInfo), tr("General")); // 将三个页Widget添加到标签Widget tabWidget->addTab(new PermissionsTab(fileInfo), tr("Permissions")); tabWidget->addTab(new ApplicationsTab(fileInfo), tr("Applications")); //! [0] //! [1] //! [2] buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok // 创建QDialogButtonBox //! [1] //! [3] | QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); // 为button定义连接信号槽 connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); //! [2] //! [3] //! [4] QVBoxLayout *mainLayout = new QVBoxLayout; // 垂直布局 mainLayout->setSizeConstraint(QLayout::SetNoConstraint); // 不强占位置:可以将窗口压到高度为0 mainLayout->addWidget(tabWidget); mainLayout->addWidget(buttonBox); setLayout(mainLayout); //! [4] //! [5] setWindowTitle(tr("Tab Dialog")); // 设置标题 } //! [5] //! [6] 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; // 文件大小,只计算多少K 整数 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()); // 上次Read时间 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); } //! [6] //! [7] // 权限页 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); } //! [7] //! [8] ApplicationsTab::ApplicationsTab(const QFileInfo &fileInfo, QWidget *parent) : QWidget(parent) { QLabel *topLabel = new QLabel(tr("Open with:")); QListWidget *applicationsListBox = new QListWidget; // 添加一个listWidget QStringList applications; for (int i = 1; i <= 30; ++i) applications.append(tr("Application %1").arg(i)); applicationsListBox->insertItems(0, applications); // 将QStringList设为listWidget的项 QCheckBox *alwaysCheckBox; // 定义一个CheckBox 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); } //! [8]