点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达
想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获
在一个完整的应用程序设计中,不可避免地会涉及多个窗体、对话框的设计和调用,如何设计和调用这些对话框和窗体是搞清楚一个庞大的应用程序设计的基础。这就涉及到对话框和多窗体设计、调用方式、数据传递等问题,主要包括以下几点。 • Qt提供的标准对话框的使用,如打开文件对话框、选择颜色对话框、字体对话框、消息提示和确认选择对话框等。 •自定义对话框的设计和调用,如何获取返回值,在对话框中如何操作主窗体等。 •在一个应用程序中如何设计多种窗体,基于QDialog、QWidget和QMainWindow创建的窗体的调用方式有哪些,它们之间有什么区别。 •如何创建一个在多页组件中管理的多窗体应用,类似于现在流行的多页浏览器的界面效果,子窗体如何与主窗体实现交互。 •如何创建 MDI (Multi-document interface)应用程序。 •如何创建一个带有启动界面(Splash)和登录界面的窗体,如何保存和读取应用程序设置的参数。整体的界面设计如下
启动界面
主窗口
子窗口
以上界面调用基本上包含了我们所需要的所有界面调用方式代码如下:头文件
#pragma once#include #include "ui_QGuiDialog.h"#include "QDialogHeaders.h"#include "QDialogLocate.h"#include #include class QGuiDialog : public QWidget{ Q_OBJECTpublic: QGuiDialog(QWidget *parent = Q_NULLPTR); ~QGuiDialog();protected: void InitConnect(); QStandardItemModel* m_pStandardItemModelDlgCustom;//数据模型 QItemSelectionModel* m_pItemSelectionModelDlgCustom;//Item选择模型 QDialogHeaders* dlgSetHeaders = NULL;//设置表头文字对话框, 一次创建,exec()重复调用 QDialogLocate* dlgLocate = NULL;public: void setActLocateEnable(bool enable);//设置actTab_Locate的enabled属性 void setACellText(int row, int column, QString text);//设置一个单元格的内容,由dlgLocate调用 void setDlgLocateNull();//将dlgLocate指针设置为NULLprivate: Ui::QGuiDialog ui;private: void paintEvent(QPaintEvent* event); void closeEvent(QCloseEvent* event); //主窗口关闭时关闭所有子窗口private slots: void btnOpenFile_clicked();//打开单个文件 void btnOpenMultiFile_clicked();//打开多个文件 void btnSelectDir_clicked();//选择目录 void btnSaveFile_clicked();//保存文件 void btnColorSelect_clicked();//颜色选择 void btnFontSelect_clicked();//字体选择 void btnMsgQuestion_clicked(); void btnMsgInformation_clicked(); void btnMsgWarning_clicked(); void btnMsgCritical_clicked(); void btnMsgAbout_clicked(); void btnMsgAboutQt_clicked(); void btnInputStringDlg_clicked();//输入字符串 void btnInputIntDlg_clicked();//输入整数 void btnInputFloatDlg_clicked();//输入浮点数 void btnInputItemDlg_clicked();//条目选择输入 void btnClearTextDlgStandard_clicked();//清空文本内容 void btnSetRowsColumns_clicked(); void btnSetHeaderLabel_clicked(); void btnLacateCells_clicked(); void ItemSelectionModelDlgCustom_currentChanged(const QModelIndex& current, const QModelIndex& previous); void btnWidgetInsite_clicked();//嵌入式widget void btnWidget_clicked();//独立widget void btnMainWindowInsite_clicked();//嵌入式mainwindow void btnMainWindow_clicked();//独立mainwindow void btnNewDoc_clicked();//新建文档 void btnOpenDoc_clicked();//打开文档 void btnCloseAll_clicked();//关闭全部 void btnCut_clicked();//剪切 void btnCopy_clicked();//复制 void btnPaste_clicked();//粘贴 void mdiArea_subWindowActivated(QMdiSubWindow* arg1);//当前活动子窗口切换时 void btnFontSet_clicked();//字体设置 void btnMdiModel_clicked(bool bChecked);//mdi模式 void btnCascade_clicked();//级联模式 void btnTile_clicked();//展开模式};
源文件
#include "QGuiDialog.h"#include #include #include #include #include #include #include #include #include #include "QDialogSize.h"#include #include "QFormDoc.h"#include "QFormTable.h"#include "QFormChildDoc.h"#include #include #pragma execution_character_set("utf-8")QGuiDialog::QGuiDialog(QWidget *parent) : QWidget(parent){ ui.setupUi(this); InitConnect(); m_pStandardItemModelDlgCustom = new QStandardItemModel(10, 5, this); //创建数据模型 m_pItemSelectionModelDlgCustom = new QItemSelectionModel(m_pStandardItemModelDlgCustom);//Item选择模型 connect(m_pItemSelectionModelDlgCustom, SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(ItemSelectionModelDlgCustom_currentChanged(const QModelIndex&, const QModelIndex&))); ui.tableViewDlgCustom->setModel(m_pStandardItemModelDlgCustom); //设置数据模型 ui.tableViewDlgCustom->setSelectionModel(m_pItemSelectionModelDlgCustom);//设置选择模型 //ui.labelCellPos->setText("当前单元格:"); //ui.labelCellPos->setMinimumWidth(180); //ui.labelCellPos->setAlignment(Qt::AlignHCenter); //ui.labelCellText->setText("单元格内容:"); //ui.labelCellText->setMinimumWidth(200); //ui.tabWidgetMultiWindow->setVisible(false); ui.tabWidgetMultiWindow->clear();//清除所有页面 ui.tabWidgetMultiWindow->tabsClosable(); //Page有关闭按钮,可被关闭 this->setWindowState(Qt::WindowMaximized); //窗口最大化显示}QGuiDialog::~QGuiDialog(){}void QGuiDialog::InitConnect(){ connect(ui.btnOpenFile, SIGNAL(clicked()), this, SLOT(btnOpenFile_clicked())); connect(ui.btnOpenMultiFile, SIGNAL(clicked()), this, SLOT(btnOpenMultiFile_clicked())); connect(ui.btnSelectDir, SIGNAL(clicked()), this, SLOT(btnSelectDir_clicked())); connect(ui.btnSaveFile, SIGNAL(clicked()), this, SLOT(btnSaveFile_clicked())); connect(ui.btnColorSelect, SIGNAL(clicked()), this, SLOT(btnColorSelect_clicked())); connect(ui.btnFontSelect, SIGNAL(clicked()), this, SLOT(btnFontSelect_clicked())); connect(ui.btnMsgQuestion, SIGNAL(clicked()), this, SLOT(btnMsgQuestion_clicked())); connect(ui.btnMsgInformation, SIGNAL(clicked()), this, SLOT(btnMsgInformation_clicked())); connect(ui.btnMsgWarning, SIGNAL(clicked()), this, SLOT(btnMsgWarning_clicked())); connect(ui.btnMsgCritical, SIGNAL(clicked()), this, SLOT(btnMsgCritical_clicked())); connect(ui.btnMsgAbout, SIGNAL(clicked()), this, SLOT(btnMsgAbout_clicked())); connect(ui.btnMsgAboutQt, SIGNAL(clicked()), this, SLOT(btnMsgAboutQt_clicked())); connect(ui.btnInputStringDlg, SIGNAL(clicked()), this, SLOT(btnInputStringDlg_clicked())); connect(ui.btnInputIntDlg, SIGNAL(clicked()), this, SLOT(btnInputIntDlg_clicked())); connect(ui.btnInputFloatDlg, SIGNAL(clicked()), this, SLOT(btnInputFloatDlg_clicked())); connect(ui.btnInputItemDlg, SIGNAL(clicked()), this, SLOT(btnInputItemDlg_clicked())); connect(ui.btnClearTextDlgStandard, SIGNAL(clicked()), this, SLOT(btnClearTextDlgStandard_clicked())); connect(ui.btnSetRowsColumns, SIGNAL(clicked()), this, SLOT(btnSetRowsColumns_clicked())); connect(ui.btnSetHeaderLabel, SIGNAL(clicked()), this, SLOT(btnSetHeaderLabel_clicked())); connect(ui.btnLacateCells, SIGNAL(clicked()), this, SLOT(btnLacateCells_clicked())); connect(ui.btnWidgetInsite, SIGNAL(clicked()), this, SLOT(btnWidgetInsite_clicked())); connect(ui.btnWidget, SIGNAL(clicked()), this, SLOT(btnWidget_clicked())); connect(ui.btnMainWindowInsite, SIGNAL(clicked()), this, SLOT(btnMainWindowInsite_clicked())); connect(ui.btnMainWindow, SIGNAL(clicked()), this, SLOT(btnMainWindow_clicked())); connect(ui.btnNewDoc, SIGNAL(clicked()), this, SLOT(btnNewDoc_clicked())); connect(ui.btnOpenDoc, SIGNAL(clicked()), this, SLOT(btnOpenDoc_clicked())); connect(ui.btnCloseAll, SIGNAL(clicked()), this, SLOT(btnCloseAll_clicked())); connect(ui.btnCut, SIGNAL(clicked()), this, SLOT(btnCut_clicked())); connect(ui.btnCopy, SIGNAL(clicked()), this, SLOT(btnCopy_clicked())); connect(ui.btnPaste, SIGNAL(clicked()), this, SLOT(btnPaste_clicked())); connect(ui.mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(mdiArea_subWindowActivated(QMdiSubWindow*))); connect(ui.btnFontSet, SIGNAL(clicked()), this, SLOT(btnFontSet_clicked())); connect(ui.btnMdiModel, SIGNAL(clicked(bool)), this, SLOT(btnMdiModel_clicked(bool))); connect(ui.btnCascade, SIGNAL(clicked()), this, SLOT(btnCascade_clicked())); connect(ui.btnTile, SIGNAL(clicked()), this, SLOT(btnTile_clicked()));}void QGuiDialog::setActLocateEnable(bool enable){ ui.btnLacateCells->setEnabled(enable);}void QGuiDialog::setACellText(int row, int column, QString text){ //定位到单元格,并设置字符串 QModelIndex index = m_pStandardItemModelDlgCustom->index(row, column);//获取模型索引 m_pItemSelectionModelDlgCustom->clearSelection(); //清除现有选择 m_pItemSelectionModelDlgCustom->setCurrentIndex(index, QItemSelectionModel::Select); //定位到单元格 m_pStandardItemModelDlgCustom->setData(index, text, Qt::DisplayRole);//设置单元格字符串}void QGuiDialog::setDlgLocateNull(){ dlgLocate = NULL;}//打开单个文件void QGuiDialog::btnOpenFile_clicked(){ //选择单个文件 QString curPath = QDir::currentPath();//获取系统当前目录 //QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径 QString dlgTitle = "选择一个文件"; //对话框标题 QString filter = "文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器 QString aFileName = QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter); if (!aFileName.isEmpty()) ui.plainTextEditDlgStandard->appendPlainText(aFileName);}void QGuiDialog::paintEvent(QPaintEvent* event){ //绘制窗口背景图片 Q_UNUSED(event); QPainter painter(this); //painter.drawPixmap(ui.stackedWidget->x() + ui.tabWidgetMultiWindow->x(), // ui.stackedWidget->y() + ui.tabWidgetMultiWindow->y() + 20, // ui.tabWidgetMultiWindow->width(), // ui.tabWidgetMultiWindow->height(), // QPixmap(":/QGuiTest/icons/back2.jpg"));}void QGuiDialog::closeEvent(QCloseEvent* event){ ui.mdiArea->closeAllSubWindows();//关闭所有子窗口 event->accept();}//打开多个文件void QGuiDialog::btnOpenMultiFile_clicked(){ //选择多个文件 // QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径 QString curPath = QDir::currentPath();//获取系统当前目录 QString dlgTitle = "选择多个文件"; //对话框标题 QString filter = "文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器 QStringList fileList = QFileDialog::getOpenFileNames(this, dlgTitle, curPath, filter); for (int i = 0; i < fileList.count(); i++) ui.plainTextEditDlgStandard->appendPlainText(fileList.at(i));}//选择目录void QGuiDialog::btnSelectDir_clicked(){ //选择文件夹 QString curPath = QCoreApplication::applicationDirPath(); //获取应用程序的路径 // QString curPath=QDir::currentPath();//获取系统当前目录 //调用打开文件对话框打开一个文件 QString dlgTitle = "选择一个目录"; //对话框标题 QString selectedDir = QFileDialog::getExistingDirectory(this, dlgTitle, curPath, QFileDialog::ShowDirsOnly); if (!selectedDir.isEmpty()) ui.plainTextEditDlgStandard->appendPlainText(selectedDir);}//保存文件void QGuiDialog::btnSaveFile_clicked(){ //保存文件 QString curPath = QCoreApplication::applicationDirPath(); //获取应用程序的路径 QString dlgTitle = "保存文件"; //对话框标题 QString filter = "文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"; //文件过滤器 QString aFileName = QFileDialog::getSaveFileName(this, dlgTitle, curPath, filter); if (!aFileName.isEmpty()) ui.plainTextEditDlgStandard->appendPlainText(aFileName);}//颜色选择void QGuiDialog::btnColorSelect_clicked(){ QPalette pal = ui.plainTextEditDlgStandard->palette(); //获取现有 palette QColor iniColor = pal.color(QPalette::Text); //现有的文字颜色 QColor color = QColorDialog::getColor(iniColor, this, "选择颜色"); if (color.isValid()) //选择有效 { pal.setColor(QPalette::Text, color); //palette 设置选择的颜色 ui.plainTextEditDlgStandard->setPalette(pal); //设置 palette }}//字体选择void QGuiDialog::btnFontSelect_clicked(){ //选择字体 QFont iniFont = ui.plainTextEditDlgStandard->font(); //获取文本框的字体 bool ok = false; QFont font = QFontDialog::getFont(&ok, iniFont); //选择字体 if (ok) //选择有效 ui.plainTextEditDlgStandard->setFont(font);}void QGuiDialog::btnMsgQuestion_clicked(){ QString dlgTitle = "Question消息框"; QString strInfo = "文件已被修改,是否保存修改?"; QMessageBox::StandardButton defaultBtn = QMessageBox::NoButton; //缺省按钮 QMessageBox::StandardButton result;//返回选择的按钮 result = QMessageBox::question(this, dlgTitle, strInfo, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, defaultBtn); if (result == QMessageBox::Yes) ui.plainTextEditDlgStandard->appendPlainText("Question消息框: Yes 被选择"); else if (result == QMessageBox::No) ui.plainTextEditDlgStandard->appendPlainText("Question消息框: No 被选择"); else if (result == QMessageBox::Cancel) ui.plainTextEditDlgStandard->appendPlainText("Question消息框: Cancel 被选择"); else ui.plainTextEditDlgStandard->appendPlainText("Question消息框: 无选择");}void QGuiDialog::btnMsgInformation_clicked(){ QString dlgTitle = "information消息框"; QString strInfo = "文件已经打开,字体大小已设置"; //QMessageBox::information(this, dlgTitle, strInfo);//使用缺省的按钮 QMessageBox::information(this, dlgTitle, strInfo, QMessageBox::Ok, QMessageBox::NoButton);}void QGuiDialog::btnMsgWarning_clicked(){ QString dlgTitle = "warning 消息框"; QString strInfo = "文件内容已经被修改"; QMessageBox::warning(this, dlgTitle, strInfo);}void QGuiDialog::btnMsgCritical_clicked(){ QString dlgTitle = "critical消息框"; QString strInfo = "有不明程序访问网络"; QMessageBox::critical(this, dlgTitle, strInfo);}void QGuiDialog::btnMsgAbout_clicked(){ QString dlgTitle = "about消息框"; QString strInfo = "我开发的数据查看软件 V1.0 \n 保留所有版权"; QMessageBox::about(this, dlgTitle, strInfo);}void QGuiDialog::btnMsgAboutQt_clicked(){ QString dlgTitle = "aboutQt消息框"; QMessageBox::aboutQt(this, dlgTitle);}//输入字符串void QGuiDialog::btnInputStringDlg_clicked(){ //输入字符串 QString dlgTitle = "输入文字对话框"; QString txtLabel = "请输入文件名"; QString defaultInput = "新建文件.txt"; QLineEdit::EchoMode echoMode = QLineEdit::Normal;//正常文字输入 //QLineEdit::EchoMode echoMode=QLineEdit::Password;//密码输入 bool ok = false; QString text = QInputDialog::getText(this, dlgTitle, txtLabel, echoMode, defaultInput, &ok); if (ok && !text.isEmpty()) ui.plainTextEditDlgStandard->appendPlainText(text);}//输入整数void QGuiDialog::btnInputIntDlg_clicked(){ //输入整数 QString dlgTitle = "输入整数对话框"; QString txtLabel = "设置字体大小"; int defaultValue = ui.plainTextEditDlgStandard->font().pointSize(); //现有字体大小 int minValue = 6, maxValue = 50, stepValue = 1; //范围,步长 bool ok = false; int inputValue = QInputDialog::getInt(this, dlgTitle, txtLabel, defaultValue, minValue, maxValue, stepValue, &ok); if (ok) //是否确认输入 { QFont font = ui.plainTextEditDlgStandard->font(); font.setPointSize(inputValue); ui.plainTextEditDlgStandard->setFont(font); }}//输入浮点数void QGuiDialog::btnInputFloatDlg_clicked(){ //输入浮点数 QString dlgTitle = "输入浮点数对话框"; QString txtLabel = "输入一个浮点数"; float defaultValue = 3.13; float minValue = 0, maxValue = 10000; //范围 int decimals = 2;//小数点位数 bool ok = false; float inputValue = QInputDialog::getDouble(this, dlgTitle, txtLabel, defaultValue, minValue, maxValue, decimals, &ok); if (ok) //确认选择 { QString str = QString::asprintf("输入了一个浮点数:%.2f", inputValue); ui.plainTextEditDlgStandard->appendPlainText(str); }}//条目选择输入void QGuiDialog::btnInputItemDlg_clicked(){ //条目选择输入 QStringList items; //ComboBox 列表的内容 items << "优秀" << "良好" << "合格" << "不合格"; QString dlgTitle = "条目选择对话框"; QString txtLabel = "请选择级别"; int curIndex = 0; //初始选择项 bool editable = true; //ComboBox是否可编辑 bool ok = false; QString text = QInputDialog::getItem(this, dlgTitle, txtLabel, items, curIndex, editable, &ok); if (ok && !text.isEmpty()) ui.plainTextEditDlgStandard->appendPlainText(text);}//清空文本内容void QGuiDialog::btnClearTextDlgStandard_clicked(){ ui.plainTextEditDlgStandard->clear();}void QGuiDialog::btnSetRowsColumns_clicked(){ //模态对话框,动态创建,用过后删除 QDialogSize* dlgTableSize = new QDialogSize(this); //创建对话框// dlgTableSize->setAttribute(Qt::WA_DeleteOnClose);//对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框//如果需要获取对话框的返回值,不能设置该属性,可以在调用完对话框后删除对话框 Qt::WindowFlags flags = dlgTableSize->windowFlags(); dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //设置对话框固定大小 dlgTableSize->setRowColumn(m_pStandardItemModelDlgCustom->rowCount(), m_pStandardItemModelDlgCustom->columnCount()); //对话框数据初始化 int ret = dlgTableSize->exec();// 以模态方式显示对话框,用户关闭对话框时返回 DialogCode值 if (ret == QDialog::Accepted) //OK键被按下,对话框关闭,若设置了setAttribute(Qt::WA_DeleteOnClose),对话框被释放,无法获得返回值 { //OK键被按下,获取对话框上的输入,设置行数和列数 int cols = dlgTableSize->columnCount(); m_pStandardItemModelDlgCustom->setColumnCount(cols); int rows = dlgTableSize->rowCount(); m_pStandardItemModelDlgCustom->setRowCount(rows); } delete dlgTableSize; //删除对话框}void QGuiDialog::btnSetHeaderLabel_clicked(){ //一次创建,多次调用,对话框关闭时只是隐藏 if (dlgSetHeaders == NULL) //如果对象没有被创建过,就创建对象 dlgSetHeaders = new QDialogHeaders(this); if (dlgSetHeaders->headerList().count() != m_pStandardItemModelDlgCustom->columnCount()) {//如果表头列数变化,重新初始化 QStringList strList; for (int i = 0; i < m_pStandardItemModelDlgCustom->columnCount(); i++)//获取现有的表头标题 strList.append(m_pStandardItemModelDlgCustom->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); dlgSetHeaders->setHeaderList(strList);//用于对话框初始化显示 } int ret = dlgSetHeaders->exec();// 以模态方式显示对话框 if (ret == QDialog::Accepted) //OK键被按下 { QStringList strList = dlgSetHeaders->headerList();//获取对话框上修改后的StringList m_pStandardItemModelDlgCustom->setHorizontalHeaderLabels(strList);// 设置模型的表头标题 }}void QGuiDialog::btnLacateCells_clicked(){ //创建 StayOnTop的对话框,对话框关闭时自动删除 ui.btnLacateCells->setEnabled(false); dlgLocate = new QDialogLocate(this); //创建对话框,传递指针 dlgLocate->setAttribute(Qt::WA_DeleteOnClose); //对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框 Qt::WindowFlags flags = dlgLocate->windowFlags(); //获取已有flags//对话框设置为固定大小和StayOnTop// dlgLocate->setWindowFlags(flags |Qt::MSWindowsFixedSizeDialogHint |Qt::WindowStaysOnTopHint); //设置对话框固定大小,StayOnTop dlgLocate->setWindowFlags(flags | Qt::WindowStaysOnTopHint); //设置对话框固定大小,StayOnTop//对话框初始化设置 dlgLocate->setSpinRange(m_pStandardItemModelDlgCustom->rowCount(), m_pStandardItemModelDlgCustom->columnCount()); QModelIndex curIndex = m_pItemSelectionModelDlgCustom->currentIndex(); if (curIndex.isValid()) dlgLocate->setSpinValue(curIndex.row(), curIndex.column()); dlgLocate->show(); //非模态显示对话框}void QGuiDialog::ItemSelectionModelDlgCustom_currentChanged(const QModelIndex& current, const QModelIndex& previous){ if (current.isValid()) //当前模型索引有效 { //ui.labelCellPos->setText(QString::asprintf("当前单元格:%d行,%d列", current.row(), current.column())); //显示模型索引的行和列号 QStandardItem* aItem; aItem = m_pStandardItemModelDlgCustom->itemFromIndex(current); //从模型索引获得Item //ui.labelCellText->setText("单元格内容:" + aItem->text()); //显示item的文字内容 }}//嵌入式widgetvoid QGuiDialog::btnWidgetInsite_clicked(){ //创建QFormDoc窗体,并在tabWidget中显示 QFormDoc* formDoc = new QFormDoc(this); formDoc->setAttribute(Qt::WA_DeleteOnClose);//关闭时自动删除 //formDoc->setWindowFlag(Qt::Widget,true); //formDoc->setWindowFlag(Qt::CustomizeWindowHint,true); //formDoc->setWindowFlag(Qt::WindowMinMaxButtonsHint,false); //formDoc->setWindowState(Qt::WindowMaximized); //formDoc->setWindowOpacity(0.5); //formDoc->setWindowModality(Qt::WindowModal); //formDoc->show(); //在单独的窗口中显示 //formDoc->setWindowTitle("基于QWidget的窗口,无父窗口,关闭时删除"); int cur = ui.tabWidgetMultiWindow->addTab(formDoc, QString::asprintf("Doc %d", ui.tabWidgetMultiWindow->count())); ui.tabWidgetMultiWindow->setCurrentIndex(cur); ui.tabWidgetMultiWindow->setVisible(true);}//独立widgetvoid QGuiDialog::btnWidget_clicked(){ QFormDoc* formDoc = new QFormDoc(); //不指定父窗口,用show()显示 formDoc->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除 formDoc->setWindowTitle("基于QWidget的窗体,无父窗口,关闭时删除"); formDoc->setWindowFlag(Qt::Window, true); //formDoc->setWindowFlag(Qt::CustomizeWindowHint,true); //formDoc->setWindowFlag(Qt::WindowMinMaxButtonsHint,true); //formDoc->setWindowFlag(Qt::WindowCloseButtonHint,true); //formDoc->setWindowFlag(Qt::WindowStaysOnTopHint,true); //formDoc->setWindowState(Qt::WindowMaximized); formDoc->setWindowOpacity(0.9); //formDoc->setWindowModality(Qt::WindowModal); formDoc->show(); //在单独的窗口中显示}//嵌入式mainwindowvoid QGuiDialog::btnMainWindowInsite_clicked(){ QFormTable* formTable = new QFormTable(this); formTable->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除 // aTable->setWindowTitle("基于QWidget的窗口,无父窗口,关闭时删除"); int cur = ui.tabWidgetMultiWindow->addTab(formTable, QString::asprintf("Table %d", ui.tabWidgetMultiWindow->count())); ui.tabWidgetMultiWindow->setCurrentIndex(cur); ui.tabWidgetMultiWindow->setVisible(true);}//独立mainwindowvoid QGuiDialog::btnMainWindow_clicked(){ QFormTable* formTable = new QFormTable(this); //formChart = new QFormTable(); //无父窗体,在windows任务栏上有显示 formTable->setAttribute(Qt::WA_DeleteOnClose); //对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框 formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,关闭时删除"); //formChart->setWindowTitle("多实例窗口,指定父窗口"); formTable->show();}//新建文档void QGuiDialog::btnNewDoc_clicked(){ //新建文件 QFormChildDoc* formDoc = new QFormChildDoc(this); // ui.mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI formDoc->show(); //在单独的窗口中显示 ui.btnCut->setEnabled(true); ui.btnCopy->setEnabled(true); ui.btnPaste->setEnabled(true); ui.btnFontSet->setEnabled(true);}//打开文档void QGuiDialog::btnOpenDoc_clicked(){ //必须先获取当前MDI子窗口,再使用打开文件对话框,否则无法获得活动的子窗口 bool needNew = false;//是否需要新建子窗口 QFormChildDoc* formDoc; if (ui.mdiArea->subWindowList().count() > 0)//如果有打开的主窗口,获取活动窗口 { QMdiSubWindow* subWindow = ui.mdiArea->activeSubWindow(); formDoc = (QFormChildDoc*)subWindow->widget(); needNew = formDoc->isFileOpened();//文件已经打开,需要新建窗口 } else { needNew = true; } QString curPath = QDir::currentPath(); QString aFileName = QFileDialog::getOpenFileName(this, tr("打开一个文件"), curPath, "C程序文件(*.h *cpp);;文本文件(*.txt);;所有文件(*.*)"); if (aFileName.isEmpty()) return;//如果未选择文件,退出 if (needNew)//需要新建子窗口 { formDoc = new QFormChildDoc(this);//指定父窗口,,必须在父窗口为Widget窗口提供一个显示区域 ui.mdiArea->addSubWindow(formDoc); } formDoc->loadFromFile(aFileName);//打开文件 formDoc->show(); ui.btnCut->setEnabled(true); ui.btnCopy->setEnabled(true); ui.btnPaste->setEnabled(true); ui.btnFontSet->setEnabled(true);}//关闭全部void QGuiDialog::btnCloseAll_clicked(){ ui.mdiArea->closeAllSubWindows();}//剪切void QGuiDialog::btnCut_clicked(){ QFormChildDoc* formDoc = (QFormChildDoc*)ui.mdiArea->activeSubWindow()->widget(); formDoc->textCut();}//复制void QGuiDialog::btnCopy_clicked(){ QFormChildDoc* formDoc = (QFormChildDoc*)ui.mdiArea->activeSubWindow()->widget(); formDoc->textCopy();}//粘贴void QGuiDialog::btnPaste_clicked(){ QFormChildDoc* formDoc = (QFormChildDoc*)ui.mdiArea->activeSubWindow()->widget(); formDoc->textPaste();}//当前活动子窗口切换时void QGuiDialog::mdiArea_subWindowActivated(QMdiSubWindow* arg1){ Q_UNUSED(arg1); if (ui.mdiArea->subWindowList().count() == 0) { //若子窗口个数为零 ui.btnCut->setEnabled(false); ui.btnCopy->setEnabled(false); ui.btnPaste->setEnabled(false); ui.btnFontSet->setEnabled(false); } else { QFormChildDoc* formDoc = static_cast(ui.mdiArea->activeSubWindow()->widget()); //ui->statusBar->showMessage(formDoc->currentFileName()); //显示主窗口的文件名 }}//字体设置void QGuiDialog::btnFontSet_clicked(){ QFormChildDoc* formDoc = (QFormChildDoc*)ui.mdiArea->activeSubWindow()->widget(); formDoc->setEditFont();}//mdi模式void QGuiDialog::btnMdiModel_clicked(bool bChecked){ if (bChecked) //Tab多页显示模式 { ui.mdiArea->setViewMode(QMdiArea::TabbedView); //Tab多页显示模式 ui.mdiArea->setTabsClosable(true); //页面可关闭 ui.btnCascade->setEnabled(false); ui.btnTile->setEnabled(false); } else 子窗口模式 { ui.mdiArea->setViewMode(QMdiArea::SubWindowView); //子窗口模式 ui.btnCascade->setEnabled(true); // ui.btnTile->setEnabled(true); // }}//级联模式void QGuiDialog::btnCascade_clicked(){ ui.mdiArea->cascadeSubWindows();}//展开模式void QGuiDialog::btnTile_clicked(){ ui.mdiArea->tileSubWindows();}
要想获取全部源代码,请在公众号下方发送"QTGUI"获取
此源代码包含前面所有章节的代码,若有不懂的地方还请与小编多多交流