目录
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类的控制
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调用进行表格组件设置。
在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()槽函数关联。
图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;
}
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(); //在单独的窗口中显示
}
QFormTable::~QFormTable()
{
QMessageBox::information(this, "消息", "FormTable窗口被删除和释放");
delete ui;
}
主窗口工具栏上的“嵌入式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();
}
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);
}