目录
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:用于设计带有菜单栏、工具栏、状态栏的主窗口,一般以独立窗口显示。
-
QSplashScreen:用作应用程序启动时的splash窗口,没有边框。
-
QMdiSubWindow:用于为QMdiArea提供一个子窗体,用于MDI(多文档)应用程序的
-
QDesktopWidget:具有多个显卡和多个显示器的系统具有多个桌面,这个类提供用户桌面
-
信息,如屏幕个数、每个屏幕的大小等。
-
QWindow:通过底层的窗囗系统表示一个窗口的类,一般作为一个父容器的嵌入式窗体, 不作为独立窗体。
2 窗体类重要特性的设置
2.1 setAttribute()函数
2.2 setWindowFlags()函数
2.3 setWindowState()函数
2.4 setWindowModality()函数
2.5 setWindowOpacity()函数
3 多窗口应用程序的设计
3.1 主窗口设计
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()槽函数关联。
图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类的使用
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(); //在单独的窗口中显示
}
3.4 QFormTable类的设计
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继承的窗口类,也是可以在其他界面组件里嵌入式显示的。文章来源:https://www.toymoban.com/news/detail-802427.html
主窗口工具栏上的“独立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();
}
3.6 QTabWidget类的控制
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】多窗体应用程序设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!