【QT】多窗体应用程序设计

这篇具有很好参考价值的文章主要介绍了【QT】多窗体应用程序设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1主要的窗体类及其用途

2 窗体类重要特性的设置

2.1 setAttribute()函数

2.2 setWindowFlags()函数

2.3 setWindowState()函数

2.4 setWindowModality()函数

2.5 setWindowOpacity()函数

3 多窗口应用程序的设计

3.1 主窗口设计

3.2 QFormDoc类的设计

3.3 QFormDoc类的使用

3.4 QFormTable类的设计

3.5 QFormTable类的使用

3.6 QTabWidget类的控制

1主要的窗体类及其用途

        常用的窗体基类是QWidget、QDialog和QMainWindow,在创建GUI应用程序时选择窗体基 类就是从这 3 个类中选择。 QWidget 直接继承于 QObject, 是 QDialog 和 QMainWindow 的父类, 其他继承于 QWidget 的窗体类还有 QSplashScreen 、 QMdiSubWindow 和 QDesktopWidget 。另外还 有一个类 QWindow ,它同时从 QObject 和 Qsurface 继承。这些类的继承关系如图 6-9 所示。
【QT】多窗体应用程序设计,Qt,qt,开发语言
这些窗体类的主要特点和用途如下。
  • QWidget:在没有指定父容器时可作为独立的窗口,指定父容器后可以作为容器的内部组件。
  • QDialog:用于设计对话框,以独立窗口显示。
  • QMainWindow:用于设计带有菜单栏、工具栏、状态栏的主窗口,一般以独立窗口显示。
  • QSplashScreen:用作应用程序启动时的splash窗口,没有边框。
  • QMdiSubWindow:用于为QMdiArea提供一个子窗体,用于MDI(多文档)应用程序的
  • QDesktopWidget:具有多个显卡和多个显示器的系统具有多个桌面,这个类提供用户桌面
  • 信息,如屏幕个数、每个屏幕的大小等。
  • QWindow:通过底层的窗囗系统表示一个窗口的类,一般作为一个父容器的嵌入式窗体, 不作为独立窗体。

2 窗体类重要特性的设置

       下面介绍QWidget类中用于窗体属性设置的几个主要函数的功能。

2.1 setAttribute()函数

        setAttribute()函数用于设置窗体的一些属性,其函数原型为:
void QWidget::setAttribute(Qt::WidgetAttribute attribute,bool on = true)
        枚举类型Qt::WidgetAttribute定义了窗体的一些属性,可以打开或关闭这些属性。枚举类型 Qt:: WidgetAttribute 常用的常量及其意义见表 6-2 。
【QT】多窗体应用程序设计,Qt,qt,开发语言

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。
【QT】多窗体应用程序设计,Qt,qt,开发语言
【QT】多窗体应用程序设计,Qt,qt,开发语言
        Qt::Widget、Qt::Window等表示窗体类型的常量可以使窗体具有缺省的外观设置,如果设置 为Qt::Dialog类型,则窗体具有对话框的缺省外观,例如标题栏没有最小化、最大化按钮。
        控制窗体显示效果和外观的设置项可定制窗体的外观,例如设置一个窗体只有最小化最大化 按钮,没有关闭按钮。

2.3 setWindowState()函数

setWindowState()函数使窗口处于最小化、最大化等状态,其函数原型是:
void QWidget::setWindowState(Qt::WindowStates windowState)
枚举类型Qt::WindowState表示了窗体的状态,其取值见表6-4。
【QT】多窗体应用程序设计,Qt,qt,开发语言

2.4 setWindowModality()函数

        setWindowModality()函数用于设置窗口的模态,只对窗口类型有用。其函数原型为:
void setWindowModality(Qt::WindowModality winndowModality)
        枚举类型Qt::WindowModality的取值意义见表6-5。
【QT】多窗体应用程序设计,Qt,qt,开发语言

2.5 setWindowOpacity()函数

        setWindowOpacity()函数用于设置窗口的透明度,其函数原型如下:
void QWidget::setWindowOpacity(qreal level)
        参数level是1.0(完全不透明)至0.0(完全透明)之间的数。窗口透明度缺省值是1.0,即 完全不透明。

3 多窗口应用程序的设计

3.1 主窗口设计

        本节以实例samp6_3演示多窗口应用程序的设计,实例主窗口如图6-10所示。
【QT】多窗体应用程序设计,Qt,qt,开发语言
图6-10 实例samp6_3的主窗口
        程序的主窗口类是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::WindowMaximized); //窗口最大化显示
    this->setAutoFillBackground(true);//设置窗体自动填充背景
}

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"));
}

       在构造函数中,将tabWidget组件设置为不可见,并且页面可关闭,这样每个页面标题部分都会出现一个关闭按钮,单击可以关闭页面。

        背景图片绘制使用窗体的paintEvent()事件,获取主窗口的画笔之后,将资源文件里的一个图片绘制在主窗口的工作区。绘图的内容在第8章详细介绍。

实例除了主窗口之外,还有两个窗口和两个对话框。

  • QFormDoc:是继承于QWidget可视化设计的窗体,主窗口工具栏上的“嵌入式Widget"和“独立Widget窗口"按钮将以两种方式使用QFormDoc类。

  • QFormTable:是继承于QMainWindow可视化设计的窗体,主窗口工具栏上的“嵌入式MainWindow”和“独立MainWindow窗口”按钮将以两种方式使用QFormTable类。

  • QWDialogSize和QWDialogHeaders就是实例samp6_2中设计的对话框类,由QFormTable调用进行表格组件设置。

3.2 QFormDoc类的设计

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

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

【QT】多窗体应用程序设计,Qt,qt,开发语言

图6-11 QFormDoc窗口设计的Action

        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);

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

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();
    使用setWindowFlag()函数,设置其为Qt::Window类型,并用show()函数显示窗口。这样创 建的是一个单独显示的窗口,并且在windows的任务栏上会有显示。若有文档窗口打开,则关闭 主窗口,而文档窗口依然存在,实际上这时候主窗口是隐藏了。若关闭所有文档窗口,主窗口自
动删除并释放,才完全关闭应用程序。
        如果创建formDoc时指定主窗口为父窗口,即:
QFormDoc *formDoc = new QFormDoc(this);
        则formDoc不会在windows的任务栏上显示,关闭主窗口时,所有文档窗口自动删除。
        图6-12是嵌入式和独立的QFormDoc窗体的显示效果,在创建独立的显示窗口时,还可以尝 试使用setWindowFlag()函数设置不同的属性,观察这些属性的控制效果。
【QT】多窗体应用程序设计,Qt,qt,开发语言
图6-12 嵌入式和独立的QFormDoc窗体显示效果

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窗口”按钮响应代码如下:文章来源地址https://www.toymoban.com/news/detail-802427.html

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 对话框进行表格大小和表头文字设置。创建QFormTable嵌 入式窗体和独立窗口的运行效果如图6-13所示。

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)
{
    bool  en=ui->tabWidget->count()>0; //再无页面时,actions禁用
    ui->tabWidget->setVisible(en);
}
【QT】多窗体应用程序设计,Qt,qt,开发语言
图6-13嵌入式和独立的QFormDoc窗体显示效果
        tabCloseRequested()信号在单击分页的关闭图标时发射,传递来的参数index表示页面的编号。 QTabWidget::widget()返回TabWidget组件中某个页面的窗体组件。获取页面的QWidget组件后, 调用close()函数关闭窗体。
        删除一个分页或切换页面时,会发射currentChanged()信号,在此信号的槽函数里判断分页个 数是否为零,以控制tabWidget是否可见。

到了这里,关于【QT】多窗体应用程序设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Qt】如何在Qt应用程序中使用设计好的UI文件

    本质上,Qt Designer的ui文件是一个以XML格式书写的文件,文件中内容描述了一个界面的widget关系树。这个文件在以下两种情况下会使用到: (1)在编译的时候,这意味着ui文件将被转换为可编译的c++代码,这个过程由 uic 完成。 (2)在应用程序运行的时候,ui文件将由 QUiLoa

    2024年01月16日
    浏览(48)
  • 16-4_Qt 5.9 C++开发指南_Qt 应用程序的发布

    用 Qt 开发一个应用程序后,将应用程序提供给用户在其他计算机上使用就是应用程序的发布。应用程序发布一般会提供一个安装程序,将应用程序的可执行文件及需要的运行库安装到用户计算机上,即使用户计算机上没有安装 Qt 也能正常运行安装的程序。 Qt的应用程序发布

    2024年02月14日
    浏览(60)
  • Qt下开发基于QGIS的应用程序

    由于有在背景地图上进行动态轨迹(曲线)显示的需要,故采用Qt+QGIS的方案! Qt5.12.12,VS2015编译器,QGIS3.10.1。 在配置之前,电脑是新装机的系统,没有任何相关软件版本。 在Qt官网(https://download.qt.io/)或国内镜像网站(https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt)或网络搜索

    2024年02月14日
    浏览(59)
  • 基于SkyEye运行Qt:著名应用程序开发框架

    Qt是一个著名的跨平台的C++图形用户界面应用程序开发框架,目前包括Qt Creator、Qt Designer等等快速开发工具,还支持2D/3D图形渲染、OpenGL,允许真正的组件编程,是与GTK、MFC、OWL、ATL一样的图形界面库。使用Qt开发的软件可以做到一次开发、任意部署,相同的代码可以在任意支

    2024年04月22日
    浏览(61)
  • 14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序

    Qt 网络模块提供一些类实现 OSI 7 层网络模型中高层的网络协议,如 HTTP、FTP、SNMP等,这些类主要是 QNetworkRequest、QNetworkReply和QNetworkAccessManager。 QNetworkRequest 类通过一个URL 地址发起网络协议请求,也保存网络请求的信息,目前支持 HTTP、FTP 和局部文件 URLs的下载或上传。 QNe

    2024年02月13日
    浏览(54)
  • 「Qt中文教程指南」如何创建基于Qt Widget的应用程序(四)

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文描述了如何使用Qt Creator创建一个小的Qt应用程序

    2024年02月06日
    浏览(58)
  • Qt 实现应用程序单实例

    目前使 Qt 运行一个实例有如下几种方式: 1.QSharedMemory 使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出;这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动。 2.文件锁 在程序运行的时候就在目录下创建一个文

    2024年02月10日
    浏览(44)
  • Qt应用程序中的 QApplication

    QApplication类是一个Qt框架中核心的应用程序类,它提供了管理应用程序的框架、事件循环和系统级配置的基础。在本文中,我们将详细介绍QApplication类的功能和应用场景。 通常,我们在主函数中创建 QApplication 对象。在创建时,我们可以指定一些命令行选项和特定于平台的参

    2024年02月15日
    浏览(39)
  • qt随记:拖动文件方式打开应用程序

    结果 即从main入口进入

    2024年02月10日
    浏览(54)
  • 基于Qt HTTP应用程序项目案例

    main函数创建对象空间,确认窗口的大小和坐标。

    2024年02月07日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包