目錄
1主要的窗體類及其用途
2 窗體類重要特性的設(shè)置
2.1 setAttribute()函數(shù)
2.2 setWindowFlags()函數(shù)
2.3 setWindowState()函數(shù)
2.4 setWindowModality()函數(shù)
2.5 setWindowOpacity()函數(shù)
3 多窗口應(yīng)用程序的設(shè)計
3.1 主窗口設(shè)計
3.2 QFormDoc類的設(shè)計
3.3 QFormDoc類的使用
3.4 QFormTable類的設(shè)計
3.5 QFormTable類的使用
3.6 QTabWidget類的控制
1主要的窗體類及其用途

-
QWidget:在沒有指定父容器時可作為獨立的窗口,指定父容器后可以作為容器的內(nèi)部組件。
-
QDialog:用于設(shè)計對話框,以獨立窗口顯示。
-
QMainWindow:用于設(shè)計帶有菜單欄、工具欄、狀態(tài)欄的主窗口,一般以獨立窗口顯示。
-
QSplashScreen:用作應(yīng)用程序啟動時的splash窗口,沒有邊框。
-
QMdiSubWindow:用于為QMdiArea提供一個子窗體,用于MDI(多文檔)應(yīng)用程序的
-
QDesktopWidget:具有多個顯卡和多個顯示器的系統(tǒng)具有多個桌面,這個類提供用戶桌面
-
信息,如屏幕個數(shù)、每個屏幕的大小等。
-
QWindow:通過底層的窗囗系統(tǒng)表示一個窗口的類,一般作為一個父容器的嵌入式窗體, 不作為獨立窗體。
2 窗體類重要特性的設(shè)置
2.1 setAttribute()函數(shù)

2.2 setWindowFlags()函數(shù)


2.3 setWindowState()函數(shù)

2.4 setWindowModality()函數(shù)

2.5 setWindowOpacity()函數(shù)
3 多窗口應(yīng)用程序的設(shè)計
3.1 主窗口設(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::WindowMaximized); //窗口最大化顯示
this->setAutoFillBackground(true);//設(shè)置窗體自動填充背景
}
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"));
}
? ??? ?在構(gòu)造函數(shù)中,將tabWidget組件設(shè)置為不可見,并且頁面可關(guān)閉,這樣每個頁面標(biāo)題部分都會出現(xiàn)一個關(guān)閉按鈕,單擊可以關(guān)閉頁面。
?? ??? ?背景圖片繪制使用窗體的paintEvent()事件,獲取主窗口的畫筆之后,將資源文件里的一個圖片繪制在主窗口的工作區(qū)。繪圖的內(nèi)容在第8章詳細介紹。
實例除了主窗口之外,還有兩個窗口和兩個對話框。
-
QFormDoc:是繼承于QWidget可視化設(shè)計的窗體,主窗口工具欄上的“嵌入式Widget"和“獨立Widget窗口"按鈕將以兩種方式使用QFormDoc類。
-
QFormTable:是繼承于QMainWindow可視化設(shè)計的窗體,主窗口工具欄上的“嵌入式MainWindow”和“獨立MainWindow窗口”按鈕將以兩種方式使用QFormTable類。
-
QWDialogSize和QWDialogHeaders就是實例samp6_2中設(shè)計的對話框類,由QFormTable調(diào)用進行表格組件設(shè)置。
3.2 QFormDoc類的設(shè)計
?? ??? ?在QtCreator單擊"File”->“NewFileorProject”菜單項,在出現(xiàn)的對話框里選擇創(chuàng)建Qt?Designer 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)。
圖6-11 QFormDoc窗口設(shè)計的Action
?? ??? ?actOpen用于打開文件,actFont用于設(shè)置文檔字體。
?? ??? ?在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);
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è)置布局
}
QFormDoc::~QFormDoc()
{
QMessageBox::information(this, "消息", "QFormDoc對象被刪除和釋放");
delete ui;
}
3.3 QFormDoc類的使用
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窗口”按鈕響應(yīng)代碼如下:
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(); //在單獨的窗口中顯示
}

3.4 QFormTable類的設(shè)計
QFormTable::~QFormTable()
{
QMessageBox::information(this, "消息", "FormTable窗口被刪除和釋放");
delete ui;
}
3.5 QFormTable類的使用
?? ??? ?主窗口工具欄上的“嵌入式MainWindow”按鈕的響應(yīng)代碼如下:
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繼承的窗口類,也是可以在其他界面組件里嵌入式顯示的。文章來源:http://www.zghlxwxcb.cn/news/detail-802427.html
?? ??? ?主窗口工具欄上的“獨立MainWindow窗口”按鈕響應(yīng)代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-802427.html
void QWMainWindow::on_actWindow_triggered()
{
QFormTable* formTable = new QFormTable(this);
// formChart = new QFormTable(); //無父窗體,在windows任務(wù)欄上有顯示
formTable->setAttribute(Qt::WA_DeleteOnClose); //對話框關(guān)閉時自動刪除對話框?qū)ο?用于不需要讀取返回值的對話框
formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,關(guān)閉時刪除");
// formChart->setWindowTitle("多實例窗口,指定父窗口");
formTable->show();
}
3.6 QTabWidget類的控制
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)
{
bool en=ui->tabWidget->count()>0; //再無頁面時,actions禁用
ui->tabWidget->setVisible(en);
}

到了這里,關(guān)于【QT】多窗體應(yīng)用程序設(shè)計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!