06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)

这篇具有很好参考价值的文章主要介绍了06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 主要的窗体类及其用途

常用的窗体基类是QWidget、QDialog 和QMainWindow,在创建 GUI应用程序时选择窗体基类就是从这 3 个类中选择。QWidget 直接继承于 QObject,是 QDialog 和 QMainWindow 的父类,其他继承于 QWidget 的窗体类还有 QSplashScreen、QMdiSubWindow和QDesktopWidget。另外还有一个类QWindow,它同时从 QObject 和QSurface 继承。这些类的继承关系如图6-9 所示。

这些窗体类的主要特点和用途如下。

  • QWidget: 在没有指定父容器时可作为独立的窗口,指定父容器后可以作为容器的内部组件

  • QDialog:用于设计对话框,以独立窗口显示。

  • QMainWindow:用于设计带有菜单栏、工具栏、状态栏的主窗口,一般以独立窗口显示

  • QSplashScreen:用作应用程序启动时的 splash 窗口,没有边框。

  • QMdiSubWindow:用于为 QMdiArea 提供一个子窗体,用于 MDI(多文档)应用程序的设计。

  • QDesktopWidget: 具有多个显卡和多个显示器的系统具有多个桌面,这个类提供用户桌面信息,如屏幕个数、每个屏幕的大小等。

  • QWindow: 通过底层的窗口系统表示一个窗口的类,一般作为一个父容器的嵌入式窗体不作为独立窗体。

2. 窗体类重要特性的设置

窗体显示或运行的一些特性可以通过 QWidget 的一些函数设置,如 6.2 节介绍对话框的创建和使用时,有如下的代码:

dlgLocate = new QWDialogLocate(this);
dlgLocate->setAttribute(Qt::WA_DeleteOnClose);
Qt::WindowFlags flags=dlgLocate->windowFlags();
dlgqLocate->getWindowFlags(flags | Qt::WindowStaysOnTopHint);

这段代码就用到了两个设置函数:setAttribute()和 setWindowFlags(),它们可以设置窗体的显示特性和运行特性。下面介绍 QWidget 类中用于窗体属性设置的几个主要函数的功能。

2.1 setAttribute()函数

setAttribute()函数用于设置窗体的一些属性,其函数原型为:

void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on = true)

枚举类型 Qt::WidgetAttribute 定义了窗体的一些属性,可以打开或关闭这些属性。枚举类型Qt::WidgetAttribute 常用的常量及其意义见表 6-2。

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

2.2 setWindowFlags()函数

setWindowFlags()函数用于设置窗体标记,其函数原型是:

void QWidget::setWindowFlags(Qt::WindowFlags type)

参数type 是枚举类型Qt::WindowType 的值的组合,用于同时设置多个标记。

另外一个函数 setWindowFlag()用于一次设置一个标记,其函数原型为:

void QWidget::setWindowFlag(Qt::WindowType flag, bool on = true)

可单独打开或关闭某个属性。枚举类型 Qt::WindowType 常用的常量值见表 6-3

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++
06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

Qt::Widget、Qt::Window 等表示窗体类型的常量可以使窗体具有缺省的外观设置,如果设置为 Qt::Dialog 类型,则窗体具有对话框的缺省外观,例如标题栏没有最小化、最大化按钮。

控制窗体显示效果和外观的设置项可定制窗体的外观,例如设置一个窗体只有最小化最大化按钮,没有关闭按钮。

2.3 setWindowState()函数

setWindowState()函数使窗口处于最小化、最大化等状态,其函数原型为:

void QWidget::setWindowState(Qt::WindowStates windowState)

枚举类型Qt::WindowState 表示了窗体的状态,其取值见表 6-4。

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

2.4 setWindowModality()函数

setWindowModality()函数用于设置窗口的模态,只对窗口类型有用。其函数原型为:

void setWindowModality(Qt::WindowModality windowModality)

枚举类型Qt::WindowModality 的取值意义见表 6-5

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

2.5 setWindowOpacity()函数

setWindowOpacity()函数用于设置窗口的透明度,其函数原型为:
void QWidget::setWindowOpacity(qreal level)

参数 level 是 1.0(完全不透明) 至 0.0(完全透明)之间的数。窗口透明度缺省值是 1.0,即完全不透明。

3. 多窗口应用程序设计

3.1 主窗口设计

本节以实例samp6_3演示多窗口应用程序的设计,实例主窗口如下图所示:

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

程序的主窗口类是 QWMainWindow,从QMainWindow 继承。主窗口有一个工具栏,4 个创建窗体的按钮以不同方式创建和使用窗体。主窗体工作区绘制一个背景图片,有一个 tabWidget组件,作为创建窗体的父窗体。没有子窗体时,tabWidget 不显示
下面是QWMainWindow 的构造函数和绘制背景图片的代码。

QWMainWindow::QWMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QWMainWindow)
{
    ui->setupUi(this);
    ui->tabWidget->setVisible(false);
    ui->tabWidget->clear();//清除所有页面
    ui->tabWidget->tabsClosable(); //Page有关闭按钮,可被关闭

    this->setCentralWidget(ui->tabWidget);
//    this->setWindowState(Qt::WindowFullScreen); //窗口最大化显示
    this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
//    this->setWindowState(Qt::WindowMinimized); //窗口最大化显示
    this->setAutoFillBackground(true);

//    this->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除

//    Qt::WindowFlags    flags=this->windowFlags();
//    this->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //设置对话框固定大小
}

在构造函数中,将 tabWidget 组件设置为不可见,并且页面可关闭,这样每个页面标题部分都会出现一个关闭按钮,单击可以关闭页面。
背景图片绘制使用窗体的 paintEvent(])事件,获取主窗口的画笔之后,将资源文件里的一个图片绘制在主窗口的工作区。绘图的内容在第 8 章详细介绍。
实例除了主窗口之外,还有两个窗口和两个对话框。
QFormDoc:是继承于QWidget 可视化设计的窗体,主窗口工具栏上的“嵌入式 Widget和“独立Widget 窗口”按钮将以两种方式使用QFormDoc 类。
QFormTable:是继承于QMainWindow 可视化设计的窗体,其界面功能与实例 samp6_2的主窗口类似,主窗口工具栏上的“嵌入式 MainWindow”和“独立MainWindow 窗口”按钮将以两种方式使用QFormTable类。
QWDialogSize和QWDialogHeaders 就是实例 samp6_2 中设计的对话框类,由 QFormTable调用进行表格组件设置。

3.2 QFormDoc类的设计

在Qt Creator 单击“File”->“New File or Project”菜单项,在出现的对话框里选择创建QtDesigner Form Class,并且在向导中选择基类为 QWidget,将创建的新类命名为 QFormDoc。

在QFormDoc 的窗口上只放置一个 QPlainTextEdit 组件。由于 QFormDoc 是从QWidget 继承而来的,在 UI设计器里不能直接为 QFormDoc 设计工具栏,但是可以创建 Action,然后在窗体创建时用代码创建工具栏。图6-11 是设计的 Action 除了 actOpen 和 actFont 之外,其他编辑操作的Action 都和QPlainTextEdit 相关槽函数关联,actClose 与窗口的 close()槽函数关联。

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

actOpen 用于打开文件,actFont 用于设置文档字体,这些功能在前面的例子里都遇到过,不是本实例的重点,不再介绍其实现代码。

在QFormDoc 的构造函数里用代码创建工具栏和布局,也可以在析构函数里增加一个消息显示的对话框,以便观察窗体是何时被删除的。代码如下:

QFormDoc::QFormDoc(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QFormDoc)
{
    ui->setupUi(this);

//使用UI设计的Actions设计工具栏
    QToolBar* locToolBar = new QToolBar(tr("文档"),this); //创建工具栏
    locToolBar->addAction(ui->actOpen);
    locToolBar->addAction(ui->actFont);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actCut);
    locToolBar->addAction(ui->actCopy);
    locToolBar->addAction(ui->actPaste);
    locToolBar->addAction(ui->actUndo);
    locToolBar->addAction(ui->actRedo);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actClose);

    locToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//    locToolBar->setAutoFillBackground(true);

    QVBoxLayout *Layout = new QVBoxLayout();
    Layout->addWidget(locToolBar); //设置工具栏和编辑器上下布局
    Layout->addWidget(ui->plainTextEdit);
    Layout->setContentsMargins(2,2,2,2); //减小边框的宽度
    Layout->setSpacing(2);
    this->setLayout(Layout); //设置布局
//    this->setAutoFillBackground(true); //避免工具栏显示背景图片
}

QFormDoc::~QFormDoc()
{
//    QMessageBox::information(this, "消息", "QFormDoc对象被删除和释放");
    delete ui;
}

3.3 QFormDoc类的使用

主窗口工具栏上的“嵌入式Widget”按钮的响应代码如下:

void QWMainWindow::on_actWidgetInsite_triggered()
{ //创建QFormDoc窗体,并在tabWidget中显示
    QFormDoc *formDoc = new QFormDoc(this); //不指定父窗口,单独用show()方法显示
    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->tabWidget->addTab(formDoc,
            QString::asprintf("Doc %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

这段代码动态创建一个 QFormDoc 类对象 formDoc,并设置其为关闭时删除。然后使用QTabWidget 的 addTab()函数,为主窗口上的 tabWidget 新建一个页面,作为 formDoc 的父窗体组件,formDoc 就在新建的页面里显示,我们称这种窗体显示方式为“嵌入式”。

主窗口工具栏上的“独立Widget 窗口”按钮响应代码如下:

void QWMainWindow::on_actWidget_triggered()
{
    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(); //在单独的窗口中显示
}

这里在创建 formDoc 对象时,并没有指定父窗口,创建窗口的代码是:

QFormDoc *formDoc = new QFormDoc(); //不指定父窗口,用show()显示

使用 setWindowFlag()函数,设置其为 Qt::Window 类型,并用 show()函数显示窗口。这样创建的是一个单独显示的窗口,并且在 windows 的任务栏上会有显示。若有文档窗口打开,则关闭主窗口,而文档窗口依然存在,实际上这时候主窗口是隐藏了。若关闭所有文档窗口,主窗口自动删除并释放,才完全关闭应用程序。
如果创建 formDoc 时指定主窗口为父窗口,即:

QFormDoc *formDoc = new QFormDoc();

则formDoc 不会在 windows 的任务栏上显示,关闭主窗口时,所有文档窗口自动删除。

图6-12 是嵌入式和独立的 QFormDoc 窗体的显示效果,在创建独立的显示窗口时,还可以尝试使用 setWindowFlag()函数设置不同的属性,观察这些属性的控制效果。

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

3.4 QFormTable类的设计

表格窗口类 QFormTable 是基于 QMainWindow 的可视窗口类,其功能与实例 samp6_2主窗口类似,使用 QStandardItemModel 模型和 QTableView 组件构成 Model/View 结构的表格数据编辑器,并且可以调用 QWDialogSize 和 QWDialogHeaders 对话框进行表格大小设置和表头设置。该窗口的具体设计不详细介绍了,只是为了观察窗口删除的时机,在析构函数里增加一个信息显示对话框。

QFormTable::~QFormTable()
{
//    QMessageBox::information(this, "消息", "FormTable窗口被删除和释放");
    delete ui;
}

3.5 QFormTable类的使用

主窗口工具栏上的“嵌入式MainWindow”按钮的响应代码如下:

void QWMainWindow::on_actWindowInsite_triggered()
{
    QFormTable *formTable = new QFormTable(this);
    formTable->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
    //    aTable->setWindowTitle("基于QWidget的窗口,无父窗口,关闭时删除");
    int cur=ui->tabWidget->addTab(formTable,
              QString::asprintf("Table %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

代码功能是创建一个 QFormTable 对象 formTable,并在主窗口的 tabWidget 组件里新增一个页面,将 formTable 显示在新增页面里。所以,即使是从QMainWindow 继承的窗口类,也是可以在其他界面组件里嵌入式显示的。
主窗口工具栏上的“独立MainWindow 窗口”按钮响应代码如下:

void QWMainWindow::on_actWindow_triggered()
{
    QFormTable* formTable = new QFormTable(this);
//    formChart = new QFormTable(); //无父窗体,在windows任务栏上有显示
    formTable->setAttribute(Qt::WA_DeleteOnClose); //对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框
    formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,关闭时删除");
//    formChart->setWindowTitle("多实例窗口,指定父窗口");
    formTable->show();
}

这样创建的 formTable 以独立窗口显示,关闭时自动删除。它指定了主窗口为父窗口,主窗
口关闭时,所有 QFormTable 类窗口自动删除。

无论是嵌入式的,还是独立的 QFormTable 窗口,都可以调用QWDialogSize 和QWDialogHeaders对话框进行表格大小和表头文字设置,对话框的调用方法在 6.2 节已有介绍。创建 QFormTable 嵌入式窗体和独立窗口的运行效果如图 6-13 所示。

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

3.6 QTabWidget类的控制

现在,单击 tabWidget 中嵌入的QFormDoc 或QFormTable 窗体工具栏上的“关闭”按钮,都可以关闭窗体并且删除分页。但是单击分页上的关闭图标,并不能关闭窗口。而且,关闭所有分页后,tabWidget 并没有隐藏,无法显示背景图片。

为此,需要对 tabWidget 的两个信号编写槽函数,tabCloseRequested()和 currentChanged()信号的槽函数代码如下:

void QWMainWindow::on_tabWidget_tabCloseRequested(int index)
{//关闭Tab
    if (index<0)
        return;

    QWidget* aForm=ui->tabWidget->widget(index);
    aForm->close();
}
void QWMainWindow::on_tabWidget_currentChanged(int index)
{
    Q_UNUSED(index);
    bool  en=ui->tabWidget->count()>0; //再无页面时,actions禁用
    ui->tabWidget->setVisible(en);
}

tabCloseRequested()信号在单击分页的关闭图标时发射,传递来的参数 index 表示页面的编号。QTabWidget::widget()返回 TabWidget 组件中某个页面的窗体组件。获取页面的 QWidget 组件后,调用 close()函数关闭窗体。
删除一个分页或切换页面时,会发射 currentChanged()信号,在此信号的槽函数里判断分页个数是否为零,以控制 tabWidget 是否可见。

4. 框架及源码

4.1 框架

4.1.1 qformdoc.ui

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

4.1.2 qformtable.ui

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

4.1.3 qwdialogheaders.ui

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

4.1.4 qwdialogsize.ui

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++

4.1.5 qwmainwindow.ui

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计),# Qt 5.9 C++开发指南,qt,c++文章来源地址https://www.toymoban.com/news/detail-638815.html

4.2 源码

4.2.1 qformdoc.cpp

#include "qformdoc.h"
#include "ui_qformdoc.h"

#include    <QToolBar>
#include    <QVBoxLayout>
#include    <QFileDialog>
#include    <QFile>
#include    <QTextStream>
#include    <QFontDialog>
#include    <QFileInfo>
#include    <QMessageBox>

#include    <qwmainwindow.h>

QFormDoc::QFormDoc(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QFormDoc)
{
    ui->setupUi(this);

//使用UI设计的Actions设计工具栏
    QToolBar* locToolBar = new QToolBar(tr("文档"),this); //创建工具栏
    locToolBar->addAction(ui->actOpen);
    locToolBar->addAction(ui->actFont);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actCut);
    locToolBar->addAction(ui->actCopy);
    locToolBar->addAction(ui->actPaste);
    locToolBar->addAction(ui->actUndo);
    locToolBar->addAction(ui->actRedo);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actClose);

    locToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//    locToolBar->setAutoFillBackground(true);

    QVBoxLayout *Layout = new QVBoxLayout();
    Layout->addWidget(locToolBar); //设置工具栏和编辑器上下布局
    Layout->addWidget(ui->plainTextEdit);
    Layout->setContentsMargins(2,2,2,2); //减小边框的宽度
    Layout->setSpacing(2);
    this->setLayout(Layout); //设置布局
//    this->setAutoFillBackground(true); //避免工具栏显示背景图片
}

QFormDoc::~QFormDoc()
{
//    QMessageBox::information(this, "消息", "QFormDoc对象被删除和释放");
    delete ui;
}

void QFormDoc::loadFromFile(QString &aFileName)
{
    QString str;
    QFile aFile(aFileName);  //以文件方式读出
    if (aFile.open(QIODevice::ReadOnly | QIODevice::Text)) //以只读文本方式打开文件
    {
        QTextStream aStream(&aFile); //用文本流读取文件
        ui->plainTextEdit->clear();//清空
        while (!aStream.atEnd())
        {
            str=aStream.readLine();//读取文件的一行
            ui->plainTextEdit->appendPlainText(str); //添加到文本框显示
        }
        aFile.close();//关闭文件

        mCurrentFile=aFileName;
        QFileInfo   fileInfo(aFileName);
        QString shorName=fileInfo.fileName();
        this->setWindowTitle(shorName);
    }
}

void QFormDoc::on_actOpen_triggered()
{
//    curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
    QString curPath=QDir::currentPath();
//调用打开文件对话框打开一个文件
    QString aFileName=QFileDialog::getOpenFileName(this,tr("打开一个文件"),curPath,
                 "C程序文件文件(*.h *cpp);;文本文件(*.txt);;所有文件(*.*)");

    if (aFileName.isEmpty())
        return; //如果未选择文件,退出

    loadFromFile(aFileName);
}

void QFormDoc::on_actFont_triggered()
{
    QFont   font;
    font=ui->plainTextEdit->font();

    bool    ok;
    font=QFontDialog::getFont(&ok,font);
    ui->plainTextEdit->setFont(font);

}

4.2.2 qformtable.cpp

#include "qformtable.h"
#include "ui_qformtable.h"

#include    <QMessageBox>

QFormTable::QFormTable(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QFormTable)
{
    ui->setupUi(this);

    theModel = new QStandardItemModel(12,6,this); //数据模型
    theSelection = new QItemSelectionModel(theModel);//Item选择模型
    //为tableView设置数据模型
    ui->tableView->setModel(theModel); //设置数据模型
    ui->tableView->setSelectionModel(theSelection);//设置选择模型

//    QMessageBox::information(this, "消息", "表格窗口被创建");
}

QFormTable::~QFormTable()
{
//    QMessageBox::information(this, "消息", "FormTable窗口被删除和释放");
    delete ui;
}

void QFormTable::on_actSize_triggered()
{
    QWDialogSize    *dlgTableSize=new QWDialogSize(this); //创建对话框

    Qt::WindowFlags    flags=dlgTableSize->windowFlags();
    dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //设置对话框固定大小

    dlgTableSize->setRowColumn(theModel->rowCount(),theModel->columnCount()); //对话框数据初始化

    int ret=dlgTableSize->exec();// 以模态方式显示对话框,用户关闭对话框时返回 DialogCode值
    if (ret==QDialog::Accepted) //OK键被按下,对话框关闭,若设置了setAttribute(Qt::WA_DeleteOnClose),对话框被释放,无法获得返回值
    { //OK键被按下,获取对话框上的输入,设置行数和列数
        int cols=dlgTableSize->columnCount();
        theModel->setColumnCount(cols);

        int rows=dlgTableSize->rowCount();
        theModel->setRowCount(rows);
    }
    delete dlgTableSize; //删除对话框
}

void QFormTable::on_actSetHeader_triggered()
{
    if (dlgSetHeaders==NULL) //如果对象没有被创建过,就创建对象
        dlgSetHeaders = new QWDialogHeaders(this);

    if (dlgSetHeaders->headerList().count()!=theModel->columnCount())
    {
        QStringList strList;
        for (int i=0;i<theModel->columnCount();i++)//获取现有的表头标题
            strList.append(theModel->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString());
        dlgSetHeaders->setHeaderList(strList);//用于对话框初始化显示
    }

    int ret=dlgSetHeaders->exec();// 以模态方式显示对话框
    if (ret==QDialog::Accepted) //OK键被按下
    {
        QStringList strList=dlgSetHeaders->headerList();//获取对话框上修改后的StringList
        theModel->setHorizontalHeaderLabels(strList);// 设置模型的表头标题
    }
}

4.2.3 qwdialogheaders.cpp

#include "qwdialogheaders.h"
#include "ui_qwdialogheaders.h"

#include    <QMessageBox>

QWDialogHeaders::QWDialogHeaders(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QWDialogHeaders)
{
    ui->setupUi(this);
    model= new QStringListModel;
    ui->listView->setModel(model);
}

QWDialogHeaders::~QWDialogHeaders()
{
//    QMessageBox::information(this, "消息", "DialogHeaders对话框被删除和释放");
    delete ui;
}

void QWDialogHeaders::setHeaderList(QStringList &headers)
{
    model->setStringList(headers);
}

QStringList QWDialogHeaders::headerList()
{
    return  model->stringList();
}

4.2.4 qwdialogsize.cpp

#include "qwdialogsize.h"
#include "ui_qwdialogsize.h"

#include    <QMessageBox>

QWDialogSize::QWDialogSize(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QWDialogSize)
{
    ui->setupUi(this);
}

QWDialogSize::~QWDialogSize()
{
//    QMessageBox::information(this,"提示","DialogSize对话框被删除");
    delete ui;
}

int QWDialogSize::rowCount()
{ //用于主窗口调用获得行数的输入值
    return  ui->spinBoxRow->value();
}

int QWDialogSize::columnCount()
{//用于主窗口调用获得列数的输入值
    return  ui->spinBoxColumn->value();
}

void QWDialogSize::setRowColumn(int row, int column)
{ //初始化数据显示
    ui->spinBoxRow->setValue(row);
    ui->spinBoxColumn->setValue(column);
}

4.2.5 qwmainwindow.cpp

#include "qwmainwindow.h"
#include "ui_qwmainwindow.h"

#include    <QPainter>
#include    <QFileDialog>
#include    "qwmisc.h"

void QWMainWindow::paintEvent(QPaintEvent *event)
{ //绘制窗口背景图片
    Q_UNUSED(event);
    QPainter painter(this);
    painter.drawPixmap(0,ui->mainToolBar->height(),this->width(),
                       this->height()-ui->mainToolBar->height()-ui->statusBar->height(),
                       QPixmap(":/images/images/back2.jpg"));
}

QWMainWindow::QWMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QWMainWindow)
{
    ui->setupUi(this);
    ui->tabWidget->setVisible(false);
    ui->tabWidget->clear();//清除所有页面
    ui->tabWidget->tabsClosable(); //Page有关闭按钮,可被关闭

    this->setCentralWidget(ui->tabWidget);
//    this->setWindowState(Qt::WindowFullScreen); //窗口最大化显示
    this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
//    this->setWindowState(Qt::WindowMinimized); //窗口最大化显示
    this->setAutoFillBackground(true);

//    this->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除

//    Qt::WindowFlags    flags=this->windowFlags();
//    this->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //设置对话框固定大小
}

QWMainWindow::~QWMainWindow()
{
    delete ui;
}

void QWMainWindow::on_tabWidget_tabCloseRequested(int index)
{//关闭Tab
    if (index<0)
        return;

    QWidget* aForm=ui->tabWidget->widget(index);
    aForm->close();
}


void QWMainWindow::on_actWidgetInsite_triggered()
{ //创建QFormDoc窗体,并在tabWidget中显示
    QFormDoc *formDoc = new QFormDoc(this); //不指定父窗口,单独用show()方法显示
    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->tabWidget->addTab(formDoc,
            QString::asprintf("Doc %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

void QWMainWindow::on_actWindowInsite_triggered()
{
    QFormTable *formTable = new QFormTable(this);
    formTable->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
    //    aTable->setWindowTitle("基于QWidget的窗口,无父窗口,关闭时删除");
    int cur=ui->tabWidget->addTab(formTable,
              QString::asprintf("Table %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

void QWMainWindow::on_actWindow_triggered()
{
    QFormTable* formTable = new QFormTable(this);
//    formChart = new QFormTable(); //无父窗体,在windows任务栏上有显示
    formTable->setAttribute(Qt::WA_DeleteOnClose); //对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框
    formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,关闭时删除");
//    formChart->setWindowTitle("多实例窗口,指定父窗口");
    formTable->show();
}


void QWMainWindow::on_actWidget_triggered()
{
    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(); //在单独的窗口中显示
}

void QWMainWindow::on_tabWidget_currentChanged(int index)
{
    Q_UNUSED(index);
    bool  en=ui->tabWidget->count()>0; //再无页面时,actions禁用
    ui->tabWidget->setVisible(en);
}

到了这里,关于06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 06-5_Qt 5.9 C++开发指南_Splash 与登录窗口(MouseEvent鼠标事件;注册表;加密)

    一般的大型应用程序在启动时会显示一个启动画面,即 Splash 窗口。Splash 窗口是一个无边对话框,一般显示一个图片,展示软件的信息。Splash 窗口显示时,程序在后台做一些比较耗时的启动准备工作,Splash 窗口显示一段时间后自动关闭,然后软件的主窗口显示出来。Qt有一个

    2024年02月13日
    浏览(16)
  • 07-3_Qt 5.9 C++开发指南_文件目录操作

    Qt 为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个。 QCoreApplication:用于提取应用程序路径、程序名等文件信息 QFile: 除了打开文件操作外,QFile 还有复制文件、删除文件等功能 QFileInfo:用于提取文件的信

    2024年02月13日
    浏览(20)
  • 09-1_Qt 5.9 C++开发指南_Qchart概述

    Qt Charts 可以很方便地绘制常见的折线图、柱状图、饼图等图表,不用自己耗费时间和精力开发绘图组件或使用第三方组件了。 本章首先介绍 Qt Charts 的基本特点和功能,以画折线图为例详细说明 Qt Charts 各主要部件的操作方法,再介绍各种常用图表的绘图方法,最后介绍鼠标

    2024年02月13日
    浏览(27)
  • 16-1_Qt 5.9 C++开发指南_多语言界面

    有些软件需要开发多语言界面版本,如中文版和英文版,并且在软件里可以方便地切换界面语言。Qt 为多语言界面提供了很好的支持,使用 Qt 的一些规则和工具,可以很方便地为应用程序开发提供多语言界面支持。 用 Qt 开发多语言界面应用程序,主要包括以下几个步骤。

    2024年02月14日
    浏览(20)
  • 04-2_Qt 5.9 C++开发指南_SpinBox使用

    QSpinBox 用于整数的显示和输入,一般显示十进制数,也可以显示二进制、十六进制的数,而且可以在显示框中增加前缀或后缀。 QDoubleSpinBox 用于浮点数的显示和输入,可以设置显示小数位数,也可以设置显示的前缀或后缀。 实例samp4_3 演示QSpinBox和QDoubleSpinBox这两个组件的使

    2024年02月14日
    浏览(24)
  • 15-1_Qt 5.9 C++开发指南_Qt多媒体模块概述

    多媒体功能指的主要是计算机的音频和视频的输入、输出、显示和播放等功能,Qt 的多媒体模块为音频和视频播放、录音、摄像头拍照和录像等提供支持,甚至还提供数字收音机的支持。本章将介绍 Qt 多媒体模块的功能和使用。 Qt 多媒体模块提供了很多类,可以实现如下的

    2024年02月13日
    浏览(20)
  • 04-5_Qt 5.9 C++开发指南_QComboBox和QPlainTextEdit

    QComboBox 是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个QLineEdit 用作输入。OComboBox 除了显示可见下拉列表外,每个项 (item,或称列表项)还可以关联一个 QVariant 类型的变量,用于存储一些不可见数据。 QPlainTextEdit 是一个多行文本编辑器,用于显示

    2024年02月14日
    浏览(23)
  • 12-4_Qt 5.9 C++开发指南_创建和使用共享库

    除了静态库,Qt 还可以创建共享库, 也就是 Windows 平台上的动态链接库 。动态链接库项目编译后生成 DLL 文件,DLL 文件在 windows 平台上应用广泛。DLL 文件是在应用程序运行时加载的,不像静态库那样在编译期间就连编到应用程序里。若更新了 DLL 文件版本,只要接口未变,

    2024年02月14日
    浏览(19)
  • 04-6_Qt 5.9 C++开发指南_QListWidget和QToolButton

    Qt 中用于项 (Item)处理的组件有两类, 一类是 Item Views ,包括 QListView、QTreeView、QTableView、QColumnView 等; 另一类是 Item Widgets ,包括 QListWidget、QTreeWidget 和QTableWidget。 Item Views 基于模型/视图(Model/Vicw)结构,视图 (View)与模型数据(Model Data)关联实现数据的显示和编辑,模型/视图结

    2024年02月13日
    浏览(19)
  • 04-4_Qt 5.9 C++开发指南_时间日期与定时器

    时间日期是经常遇到的数据类型,Qt 中时间日期类型的类如下。 QTime:时间数据类型,仅表示时间,如 15:23:13。 QDate:日期数据类型,仅表示日期,如2017-4-5. QDateTime:日期时间数据类型,表示日期和时间,如2017-03-23 08:12:43. Qt 中有专门用于日期、时间编辑和显示的 界面组件 ,介

    2024年02月14日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包