国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計)

這篇具有很好參考價值的文章主要介紹了06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 主要的窗體類及其用途

常用的窗體基類是QWidget、QDialog 和QMainWindow,在創(chuàng)建 GUI應用程序時選擇窗體基類就是從這 3 個類中選擇。QWidget 直接繼承于 QObject,是 QDialog 和 QMainWindow 的父類,其他繼承于 QWidget 的窗體類還有 QSplashScreen、QMdiSubWindow和QDesktopWidget。另外還有一個類QWindow,它同時從 QObject 和QSurface 繼承。這些類的繼承關(guān)系如圖6-9 所示。

這些窗體類的主要特點和用途如下。

  • QWidget: 在沒有指定父容器時可作為獨立的窗口,指定父容器后可以作為容器的內(nèi)部組件

  • QDialog:用于設(shè)計對話框,以獨立窗口顯示。

  • QMainWindow:用于設(shè)計帶有菜單欄、工具欄、狀態(tài)欄的主窗口,一般以獨立窗口顯示

  • QSplashScreen:用作應用程序啟動時的 splash 窗口,沒有邊框。

  • QMdiSubWindow:用于為 QMdiArea 提供一個子窗體,用于 MDI(多文檔)應用程序的設(shè)計。

  • QDesktopWidget: 具有多個顯卡和多個顯示器的系統(tǒng)具有多個桌面,這個類提供用戶桌面信息,如屏幕個數(shù)、每個屏幕的大小等。

  • QWindow: 通過底層的窗口系統(tǒng)表示一個窗口的類,一般作為一個父容器的嵌入式窗體不作為獨立窗體。

2. 窗體類重要特性的設(shè)置

窗體顯示或運行的一些特性可以通過 QWidget 的一些函數(shù)設(shè)置,如 6.2 節(jié)介紹對話框的創(chuàng)建和使用時,有如下的代碼:

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

這段代碼就用到了兩個設(shè)置函數(shù):setAttribute()和 setWindowFlags(),它們可以設(shè)置窗體的顯示特性和運行特性。下面介紹 QWidget 類中用于窗體屬性設(shè)置的幾個主要函數(shù)的功能。

2.1 setAttribute()函數(shù)

setAttribute()函數(shù)用于設(shè)置窗體的一些屬性,其函數(shù)原型為:

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

枚舉類型 Qt::WidgetAttribute 定義了窗體的一些屬性,可以打開或關(guān)閉這些屬性。枚舉類型Qt::WidgetAttribute 常用的常量及其意義見表 6-2。

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

2.2 setWindowFlags()函數(shù)

setWindowFlags()函數(shù)用于設(shè)置窗體標記,其函數(shù)原型是:

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

參數(shù)type 是枚舉類型Qt::WindowType 的值的組合,用于同時設(shè)置多個標記。

另外一個函數(shù) setWindowFlag()用于一次設(shè)置一個標記,其函數(shù)原型為:

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

可單獨打開或關(guān)閉某個屬性。枚舉類型 Qt::WindowType 常用的常量值見表 6-3

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++
06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

Qt::Widget、Qt::Window 等表示窗體類型的常量可以使窗體具有缺省的外觀設(shè)置,如果設(shè)置為 Qt::Dialog 類型,則窗體具有對話框的缺省外觀,例如標題欄沒有最小化、最大化按鈕。

控制窗體顯示效果和外觀的設(shè)置項可定制窗體的外觀,例如設(shè)置一個窗體只有最小化最大化按鈕,沒有關(guān)閉按鈕。

2.3 setWindowState()函數(shù)

setWindowState()函數(shù)使窗口處于最小化、最大化等狀態(tài),其函數(shù)原型為:

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

枚舉類型Qt::WindowState 表示了窗體的狀態(tài),其取值見表 6-4。

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

2.4 setWindowModality()函數(shù)

setWindowModality()函數(shù)用于設(shè)置窗口的模態(tài),只對窗口類型有用。其函數(shù)原型為:

void setWindowModality(Qt::WindowModality windowModality)

枚舉類型Qt::WindowModality 的取值意義見表 6-5

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

2.5 setWindowOpacity()函數(shù)

setWindowOpacity()函數(shù)用于設(shè)置窗口的透明度,其函數(shù)原型為:
void QWidget::setWindowOpacity(qreal level)

參數(shù) level 是 1.0(完全不透明) 至 0.0(完全透明)之間的數(shù)。窗口透明度缺省值是 1.0,即完全不透明。

3. 多窗口應用程序設(shè)計

3.1 主窗口設(shè)計

本節(jié)以實例samp6_3演示多窗口應用程序的設(shè)計,實例主窗口如下圖所示:

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

程序的主窗口類是 QWMainWindow,從QMainWindow 繼承。主窗口有一個工具欄,4 個創(chuàng)建窗體的按鈕以不同方式創(chuàng)建和使用窗體。主窗體工作區(qū)繪制一個背景圖片,有一個 tabWidget組件,作為創(chuàng)建窗體的父窗體。沒有子窗體時,tabWidget 不顯示
下面是QWMainWindow 的構(gòu)造函數(shù)和繪制背景圖片的代碼。

QWMainWindow::QWMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QWMainWindow)
{
    ui->setupUi(this);
    ui->tabWidget->setVisible(false);
    ui->tabWidget->clear();//清除所有頁面
    ui->tabWidget->tabsClosable(); //Page有關(guān)閉按鈕,可被關(guān)閉

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

//    this->setAttribute(Qt::WA_DeleteOnClose); //關(guān)閉時自動刪除

//    Qt::WindowFlags    flags=this->windowFlags();
//    this->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //設(shè)置對話框固定大小
}

在構(gòu)造函數(shù)中,將 tabWidget 組件設(shè)置為不可見,并且頁面可關(guān)閉,這樣每個頁面標題部分都會出現(xiàn)一個關(guān)閉按鈕,單擊可以關(guān)閉頁面。
背景圖片繪制使用窗體的 paintEvent(])事件,獲取主窗口的畫筆之后,將資源文件里的一個圖片繪制在主窗口的工作區(qū)。繪圖的內(nèi)容在第 8 章詳細介紹。
實例除了主窗口之外,還有兩個窗口和兩個對話框。
QFormDoc:是繼承于QWidget 可視化設(shè)計的窗體,主窗口工具欄上的“嵌入式 Widget和“獨立Widget 窗口”按鈕將以兩種方式使用QFormDoc 類。
QFormTable:是繼承于QMainWindow 可視化設(shè)計的窗體,其界面功能與實例 samp6_2的主窗口類似,主窗口工具欄上的“嵌入式 MainWindow”和“獨立MainWindow 窗口”按鈕將以兩種方式使用QFormTable類。
QWDialogSize和QWDialogHeaders 就是實例 samp6_2 中設(shè)計的對話框類,由 QFormTable調(diào)用進行表格組件設(shè)置。

3.2 QFormDoc類的設(shè)計

在Qt Creator 單擊“File”->“New File or Project”菜單項,在出現(xiàn)的對話框里選擇創(chuàng)建QtDesigner Form Class,并且在向?qū)е羞x擇基類為 QWidget,將創(chuàng)建的新類命名為 QFormDoc。

在QFormDoc 的窗口上只放置一個 QPlainTextEdit 組件。由于 QFormDoc 是從QWidget 繼承而來的,在 UI設(shè)計器里不能直接為 QFormDoc 設(shè)計工具欄,但是可以創(chuàng)建 Action,然后在窗體創(chuàng)建時用代碼創(chuàng)建工具欄。圖6-11 是設(shè)計的 Action 除了 actOpen 和 actFont 之外,其他編輯操作的Action 都和QPlainTextEdit 相關(guān)槽函數(shù)關(guān)聯(lián),actClose 與窗口的 close()槽函數(shù)關(guān)聯(lián)。

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

actOpen 用于打開文件,actFont 用于設(shè)置文檔字體,這些功能在前面的例子里都遇到過,不是本實例的重點,不再介紹其實現(xiàn)代碼。

在QFormDoc 的構(gòu)造函數(shù)里用代碼創(chuàng)建工具欄和布局,也可以在析構(gòu)函數(shù)里增加一個消息顯示的對話框,以便觀察窗體是何時被刪除的。代碼如下:

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

//使用UI設(shè)計的Actions設(shè)計工具欄
    QToolBar* locToolBar = new QToolBar(tr("文檔"),this); //創(chuàng)建工具欄
    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); //設(shè)置工具欄和編輯器上下布局
    Layout->addWidget(ui->plainTextEdit);
    Layout->setContentsMargins(2,2,2,2); //減小邊框的寬度
    Layout->setSpacing(2);
    this->setLayout(Layout); //設(shè)置布局
//    this->setAutoFillBackground(true); //避免工具欄顯示背景圖片
}

QFormDoc::~QFormDoc()
{
//    QMessageBox::information(this, "消息", "QFormDoc對象被刪除和釋放");
    delete ui;
}

3.3 QFormDoc類的使用

主窗口工具欄上的“嵌入式Widget”按鈕的響應代碼如下:

void QWMainWindow::on_actWidgetInsite_triggered()
{ //創(chuàng)建QFormDoc窗體,并在tabWidget中顯示
    QFormDoc *formDoc = new QFormDoc(this); //不指定父窗口,單獨用show()方法顯示
    formDoc->setAttribute(Qt::WA_DeleteOnClose); //關(guān)閉時自動刪除

//    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的窗口,無父窗口,關(guān)閉時刪除");
    int cur=ui->tabWidget->addTab(formDoc,
            QString::asprintf("Doc %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

這段代碼動態(tài)創(chuàng)建一個 QFormDoc 類對象 formDoc,并設(shè)置其為關(guān)閉時刪除。然后使用QTabWidget 的 addTab()函數(shù),為主窗口上的 tabWidget 新建一個頁面,作為 formDoc 的父窗體組件,formDoc 就在新建的頁面里顯示,我們稱這種窗體顯示方式為“嵌入式”。

主窗口工具欄上的“獨立Widget 窗口”按鈕響應代碼如下:

void QWMainWindow::on_actWidget_triggered()
{
    QFormDoc *formDoc = new QFormDoc(); //不指定父窗口,用show()顯示
    formDoc->setAttribute(Qt::WA_DeleteOnClose); //關(guān)閉時自動刪除
    formDoc->setWindowTitle("基于QWidget的窗體,無父窗口,關(guān)閉時刪除");

    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(); //在單獨的窗口中顯示
}

這里在創(chuàng)建 formDoc 對象時,并沒有指定父窗口,創(chuàng)建窗口的代碼是:

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

使用 setWindowFlag()函數(shù),設(shè)置其為 Qt::Window 類型,并用 show()函數(shù)顯示窗口。這樣創(chuàng)建的是一個單獨顯示的窗口,并且在 windows 的任務欄上會有顯示。若有文檔窗口打開,則關(guān)閉主窗口,而文檔窗口依然存在,實際上這時候主窗口是隱藏了。若關(guān)閉所有文檔窗口,主窗口自動刪除并釋放,才完全關(guān)閉應用程序。
如果創(chuàng)建 formDoc 時指定主窗口為父窗口,即:

QFormDoc *formDoc = new QFormDoc();

則formDoc 不會在 windows 的任務欄上顯示,關(guān)閉主窗口時,所有文檔窗口自動刪除。

圖6-12 是嵌入式和獨立的 QFormDoc 窗體的顯示效果,在創(chuàng)建獨立的顯示窗口時,還可以嘗試使用 setWindowFlag()函數(shù)設(shè)置不同的屬性,觀察這些屬性的控制效果。

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

3.4 QFormTable類的設(shè)計

表格窗口類 QFormTable 是基于 QMainWindow 的可視窗口類,其功能與實例 samp6_2主窗口類似,使用 QStandardItemModel 模型和 QTableView 組件構(gòu)成 Model/View 結(jié)構(gòu)的表格數(shù)據(jù)編輯器,并且可以調(diào)用 QWDialogSize 和 QWDialogHeaders 對話框進行表格大小設(shè)置和表頭設(shè)置。該窗口的具體設(shè)計不詳細介紹了,只是為了觀察窗口刪除的時機,在析構(gòu)函數(shù)里增加一個信息顯示對話框。

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); //關(guān)閉時自動刪除
    //    aTable->setWindowTitle("基于QWidget的窗口,無父窗口,關(guān)閉時刪除");
    int cur=ui->tabWidget->addTab(formTable,
              QString::asprintf("Table %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

代碼功能是創(chuàng)建一個 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); //對話框關(guān)閉時自動刪除對話框?qū)ο?用于不需要讀取返回值的對話框
    formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,關(guān)閉時刪除");
//    formChart->setWindowTitle("多實例窗口,指定父窗口");
    formTable->show();
}

這樣創(chuàng)建的 formTable 以獨立窗口顯示,關(guān)閉時自動刪除。它指定了主窗口為父窗口,主窗
口關(guān)閉時,所有 QFormTable 類窗口自動刪除。

無論是嵌入式的,還是獨立的 QFormTable 窗口,都可以調(diào)用QWDialogSize 和QWDialogHeaders對話框進行表格大小和表頭文字設(shè)置,對話框的調(diào)用方法在 6.2 節(jié)已有介紹。創(chuàng)建 QFormTable 嵌入式窗體和獨立窗口的運行效果如圖 6-13 所示。

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

3.6 QTabWidget類的控制

現(xiàn)在,單擊 tabWidget 中嵌入的QFormDoc 或QFormTable 窗體工具欄上的“關(guān)閉”按鈕,都可以關(guān)閉窗體并且刪除分頁。但是單擊分頁上的關(guān)閉圖標,并不能關(guān)閉窗口。而且,關(guān)閉所有分頁后,tabWidget 并沒有隱藏,無法顯示背景圖片。

為此,需要對 tabWidget 的兩個信號編寫槽函數(shù),tabCloseRequested()和 currentChanged()信號的槽函數(shù)代碼如下:

void QWMainWindow::on_tabWidget_tabCloseRequested(int index)
{//關(guān)閉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()信號在單擊分頁的關(guān)閉圖標時發(fā)射,傳遞來的參數(shù) index 表示頁面的編號。QTabWidget::widget()返回 TabWidget 組件中某個頁面的窗體組件。獲取頁面的 QWidget 組件后,調(diào)用 close()函數(shù)關(guān)閉窗體。
刪除一個分頁或切換頁面時,會發(fā)射 currentChanged()信號,在此信號的槽函數(shù)里判斷分頁個數(shù)是否為零,以控制 tabWidget 是否可見。

4. 框架及源碼

4.1 框架

4.1.1 qformdoc.ui

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

4.1.2 qformtable.ui

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

4.1.3 qwdialogheaders.ui

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

4.1.4 qwdialogsize.ui

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++

4.1.5 qwmainwindow.ui

06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計),# Qt 5.9 C++開發(fā)指南,qt,c++文章來源地址http://www.zghlxwxcb.cn/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設(shè)計的Actions設(shè)計工具欄
    QToolBar* locToolBar = new QToolBar(tr("文檔"),this); //創(chuàng)建工具欄
    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); //設(shè)置工具欄和編輯器上下布局
    Layout->addWidget(ui->plainTextEdit);
    Layout->setContentsMargins(2,2,2,2); //減小邊框的寬度
    Layout->setSpacing(2);
    this->setLayout(Layout); //設(shè)置布局
//    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();//關(guān)閉文件

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

void QFormDoc::on_actOpen_triggered()
{
//    curPath=QCoreApplication::applicationDirPath(); //獲取應用程序的路徑
    QString curPath=QDir::currentPath();
//調(diào)用打開文件對話框打開一個文件
    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); //數(shù)據(jù)模型
    theSelection = new QItemSelectionModel(theModel);//Item選擇模型
    //為tableView設(shè)置數(shù)據(jù)模型
    ui->tableView->setModel(theModel); //設(shè)置數(shù)據(jù)模型
    ui->tableView->setSelectionModel(theSelection);//設(shè)置選擇模型

//    QMessageBox::information(this, "消息", "表格窗口被創(chuàng)建");
}

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

void QFormTable::on_actSize_triggered()
{
    QWDialogSize    *dlgTableSize=new QWDialogSize(this); //創(chuàng)建對話框

    Qt::WindowFlags    flags=dlgTableSize->windowFlags();
    dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //設(shè)置對話框固定大小

    dlgTableSize->setRowColumn(theModel->rowCount(),theModel->columnCount()); //對話框數(shù)據(jù)初始化

    int ret=dlgTableSize->exec();// 以模態(tài)方式顯示對話框,用戶關(guān)閉對話框時返回 DialogCode值
    if (ret==QDialog::Accepted) //OK鍵被按下,對話框關(guān)閉,若設(shè)置了setAttribute(Qt::WA_DeleteOnClose),對話框被釋放,無法獲得返回值
    { //OK鍵被按下,獲取對話框上的輸入,設(shè)置行數(shù)和列數(shù)
        int cols=dlgTableSize->columnCount();
        theModel->setColumnCount(cols);

        int rows=dlgTableSize->rowCount();
        theModel->setRowCount(rows);
    }
    delete dlgTableSize; //刪除對話框
}

void QFormTable::on_actSetHeader_triggered()
{
    if (dlgSetHeaders==NULL) //如果對象沒有被創(chuàng)建過,就創(chuàng)建對象
        dlgSetHeaders = new QWDialogHeaders(this);

    if (dlgSetHeaders->headerList().count()!=theModel->columnCount())
    {
        QStringList strList;
        for (int i=0;i<theModel->columnCount();i++)//獲取現(xiàn)有的表頭標題
            strList.append(theModel->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString());
        dlgSetHeaders->setHeaderList(strList);//用于對話框初始化顯示
    }

    int ret=dlgSetHeaders->exec();// 以模態(tài)方式顯示對話框
    if (ret==QDialog::Accepted) //OK鍵被按下
    {
        QStringList strList=dlgSetHeaders->headerList();//獲取對話框上修改后的StringList
        theModel->setHorizontalHeaderLabels(strList);// 設(shè)置模型的表頭標題
    }
}

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()
{ //用于主窗口調(diào)用獲得行數(shù)的輸入值
    return  ui->spinBoxRow->value();
}

int QWDialogSize::columnCount()
{//用于主窗口調(diào)用獲得列數(shù)的輸入值
    return  ui->spinBoxColumn->value();
}

void QWDialogSize::setRowColumn(int row, int column)
{ //初始化數(shù)據(jù)顯示
    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有關(guān)閉按鈕,可被關(guān)閉

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

//    this->setAttribute(Qt::WA_DeleteOnClose); //關(guān)閉時自動刪除

//    Qt::WindowFlags    flags=this->windowFlags();
//    this->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //設(shè)置對話框固定大小
}

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

void QWMainWindow::on_tabWidget_tabCloseRequested(int index)
{//關(guān)閉Tab
    if (index<0)
        return;

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


void QWMainWindow::on_actWidgetInsite_triggered()
{ //創(chuàng)建QFormDoc窗體,并在tabWidget中顯示
    QFormDoc *formDoc = new QFormDoc(this); //不指定父窗口,單獨用show()方法顯示
    formDoc->setAttribute(Qt::WA_DeleteOnClose); //關(guān)閉時自動刪除

//    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的窗口,無父窗口,關(guān)閉時刪除");
    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); //關(guān)閉時自動刪除
    //    aTable->setWindowTitle("基于QWidget的窗口,無父窗口,關(guān)閉時刪除");
    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); //對話框關(guān)閉時自動刪除對話框?qū)ο?用于不需要讀取返回值的對話框
    formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,關(guān)閉時刪除");
//    formChart->setWindowTitle("多實例窗口,指定父窗口");
    formTable->show();
}


void QWMainWindow::on_actWidget_triggered()
{
    QFormDoc *formDoc = new QFormDoc(); //不指定父窗口,用show()顯示
    formDoc->setAttribute(Qt::WA_DeleteOnClose); //關(guān)閉時自動刪除
    formDoc->setWindowTitle("基于QWidget的窗體,無父窗口,關(guān)閉時刪除");

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

到了這里,關(guān)于06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設(shè)計(主要的窗體類及其用途;窗體類重要特性設(shè)置;多窗口應用程序設(shè)計)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 06-5_Qt 5.9 C++開發(fā)指南_Splash 與登錄窗口(MouseEvent鼠標事件;注冊表;加密)

    06-5_Qt 5.9 C++開發(fā)指南_Splash 與登錄窗口(MouseEvent鼠標事件;注冊表;加密)

    一般的大型應用程序在啟動時會顯示一個啟動畫面,即 Splash 窗口。Splash 窗口是一個無邊對話框,一般顯示一個圖片,展示軟件的信息。Splash 窗口顯示時,程序在后臺做一些比較耗時的啟動準備工作,Splash 窗口顯示一段時間后自動關(guān)閉,然后軟件的主窗口顯示出來。Qt有一個

    2024年02月13日
    瀏覽(34)
  • 04-2_Qt 5.9 C++開發(fā)指南_SpinBox使用

    04-2_Qt 5.9 C++開發(fā)指南_SpinBox使用

    QSpinBox 用于整數(shù)的顯示和輸入,一般顯示十進制數(shù),也可以顯示二進制、十六進制的數(shù),而且可以在顯示框中增加前綴或后綴。 QDoubleSpinBox 用于浮點數(shù)的顯示和輸入,可以設(shè)置顯示小數(shù)位數(shù),也可以設(shè)置顯示的前綴或后綴。 實例samp4_3 演示QSpinBox和QDoubleSpinBox這兩個組件的使

    2024年02月14日
    瀏覽(25)
  • 16-1_Qt 5.9 C++開發(fā)指南_多語言界面

    16-1_Qt 5.9 C++開發(fā)指南_多語言界面

    有些軟件需要開發(fā)多語言界面版本,如中文版和英文版,并且在軟件里可以方便地切換界面語言。Qt 為多語言界面提供了很好的支持,使用 Qt 的一些規(guī)則和工具,可以很方便地為應用程序開發(fā)提供多語言界面支持。 用 Qt 開發(fā)多語言界面應用程序,主要包括以下幾個步驟。

    2024年02月14日
    瀏覽(23)
  • 07-3_Qt 5.9 C++開發(fā)指南_文件目錄操作

    07-3_Qt 5.9 C++開發(fā)指南_文件目錄操作

    Qt 為文件和目錄操作提供了一些類,利用這些類可以方便地實現(xiàn)一些操作。Qt 提供的與文件和目錄操作相關(guān)的類包括以下幾個。 QCoreApplication:用于提取應用程序路徑、程序名等文件信息 QFile: 除了打開文件操作外,QFile 還有復制文件、刪除文件等功能 QFileInfo:用于提取文件的信

    2024年02月13日
    瀏覽(48)
  • 09-1_Qt 5.9 C++開發(fā)指南_Qchart概述

    09-1_Qt 5.9 C++開發(fā)指南_Qchart概述

    Qt Charts 可以很方便地繪制常見的折線圖、柱狀圖、餅圖等圖表,不用自己耗費時間和精力開發(fā)繪圖組件或使用第三方組件了。 本章首先介紹 Qt Charts 的基本特點和功能,以畫折線圖為例詳細說明 Qt Charts 各主要部件的操作方法,再介紹各種常用圖表的繪圖方法,最后介紹鼠標

    2024年02月13日
    瀏覽(68)
  • 15-1_Qt 5.9 C++開發(fā)指南_Qt多媒體模塊概述

    15-1_Qt 5.9 C++開發(fā)指南_Qt多媒體模塊概述

    多媒體功能指的主要是計算機的音頻和視頻的輸入、輸出、顯示和播放等功能,Qt 的多媒體模塊為音頻和視頻播放、錄音、攝像頭拍照和錄像等提供支持,甚至還提供數(shù)字收音機的支持。本章將介紹 Qt 多媒體模塊的功能和使用。 Qt 多媒體模塊提供了很多類,可以實現(xiàn)如下的

    2024年02月13日
    瀏覽(39)
  • 12-4_Qt 5.9 C++開發(fā)指南_創(chuàng)建和使用共享庫

    12-4_Qt 5.9 C++開發(fā)指南_創(chuàng)建和使用共享庫

    除了靜態(tài)庫,Qt 還可以創(chuàng)建共享庫, 也就是 Windows 平臺上的動態(tài)鏈接庫 。動態(tài)鏈接庫項目編譯后生成 DLL 文件,DLL 文件在 windows 平臺上應用廣泛。DLL 文件是在應用程序運行時加載的,不像靜態(tài)庫那樣在編譯期間就連編到應用程序里。若更新了 DLL 文件版本,只要接口未變,

    2024年02月14日
    瀏覽(31)
  • 04-5_Qt 5.9 C++開發(fā)指南_QComboBox和QPlainTextEdit

    04-5_Qt 5.9 C++開發(fā)指南_QComboBox和QPlainTextEdit

    QComboBox 是下拉列表框組件類,它提供一個下拉列表供用戶選擇,也可以直接當作一個QLineEdit 用作輸入。OComboBox 除了顯示可見下拉列表外,每個項 (item,或稱列表項)還可以關(guān)聯(lián)一個 QVariant 類型的變量,用于存儲一些不可見數(shù)據(jù)。 QPlainTextEdit 是一個多行文本編輯器,用于顯示

    2024年02月14日
    瀏覽(28)
  • 04-6_Qt 5.9 C++開發(fā)指南_QListWidget和QToolButton

    04-6_Qt 5.9 C++開發(fā)指南_QListWidget和QToolButton

    Qt 中用于項 (Item)處理的組件有兩類, 一類是 Item Views ,包括 QListView、QTreeView、QTableView、QColumnView 等; 另一類是 Item Widgets ,包括 QListWidget、QTreeWidget 和QTableWidget。 Item Views 基于模型/視圖(Model/Vicw)結(jié)構(gòu),視圖 (View)與模型數(shù)據(jù)(Model Data)關(guān)聯(lián)實現(xiàn)數(shù)據(jù)的顯示和編輯,模型/視圖結(jié)

    2024年02月13日
    瀏覽(30)
  • 04-4_Qt 5.9 C++開發(fā)指南_時間日期與定時器

    04-4_Qt 5.9 C++開發(fā)指南_時間日期與定時器

    時間日期是經(jīng)常遇到的數(shù)據(jù)類型,Qt 中時間日期類型的類如下。 QTime:時間數(shù)據(jù)類型,僅表示時間,如 15:23:13。 QDate:日期數(shù)據(jù)類型,僅表示日期,如2017-4-5. QDateTime:日期時間數(shù)據(jù)類型,表示日期和時間,如2017-03-23 08:12:43. Qt 中有專門用于日期、時間編輯和顯示的 界面組件 ,介

    2024年02月14日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包