【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】多窗体应用程序设计_第1张图片
这些窗体类的主要特点和用途如下。
  • 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】多窗体应用程序设计_第2张图片

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

2.3 setWindowState()函数

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

2.4 setWindowModality()函数

        setWindowModality()函数用于设置窗口的模态,只对窗口类型有用。其函数原型为:
void setWindowModality(Qt::WindowModality winndowModality)
        枚举类型Qt::WindowModality的取值意义见表6-5。

2.5 setWindowOpacity()函数

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

3 多窗口应用程序的设计

3.1 主窗口设计

        本节以实例samp6_3演示多窗口应用程序的设计,实例主窗口如图6-10所示。
【QT】多窗体应用程序设计_第6张图片
图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】多窗体应用程序设计_第7张图片

图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】多窗体应用程序设计_第8张图片
图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窗口”按钮响应代码如下:

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】多窗体应用程序设计_第9张图片
图6-13嵌入式和独立的QFormDoc窗体显示效果
        tabCloseRequested()信号在单击分页的关闭图标时发射,传递来的参数index表示页面的编号。 QTabWidget::widget()返回TabWidget组件中某个页面的窗体组件。获取页面的QWidget组件后, 调用close()函数关闭窗体。
        删除一个分页或切换页面时,会发射currentChanged()信号,在此信号的槽函数里判断分页个 数是否为零,以控制tabWidget是否可见。

你可能感兴趣的:(Qt,qt,开发语言)