qt做嵌入式界面教程 (qt多界面编程技巧)

应用程序很少只由一个窗体组成, 一般情况下一个应用程序均拥有很多个窗体。本文以一个详细的示例,展示开发多窗体应用程序的基本方法。

qt界面编程教程,qt多窗口编程

嵌入式和独立的子窗体的显示效果

主窗口设计

程序的主窗口类是MainWindow,从QMainWindow继承。主窗体工作区有一个tabWidget 组件,作为创建嵌入窗体的父窗体。

新建2个action,分别命名为actionEmbed(“新建嵌入Widget窗口”)和actionAlone(“新建独立Widget窗口”),不同方式创建和使用窗体。

主窗口有一个工具栏,拖动action到工具栏上,创建2个工具按钮。

qt界面编程教程,qt多窗口编程

主窗体

下面是QWMainWindow的构造函数代码。

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  ui->tabWidget->clear();
  this->setCentralWidget(ui->tabWidget);
}

子窗体设计

在Qt Creator中单击“File”-“New File or Project”菜单项,在出现的对话框里选择创建Qt Designer Form Class,并且在向导中选择基类为QWidget,将创建的新类命名为FormDoc。

qt界面编程教程,qt多窗口编程

子窗体

在FormDoc的窗口上放置一个QPlainTextEdit组件和一个pushButton,垂直排列。pushButton按钮用于关闭子窗口,代码如下:

void FormDoc::on_btnClose_clicked()
{
	this->close();
}

新建嵌入式子窗口

主窗口工具栏上的“新建嵌入Widget窗口”按钮的响应代码如下:

void MainWindow::on_actionEmbed_triggered()
{ //创建QFormDoc窗体,并在tabWidget中显示
  FormDoc *aform=new FormDoc(this);
  aform->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
  int cur=ui->tabWidget->addTab(aform,
               QString::asprintf("Doc %d",ui->tabWidget->count()));
  ui->tabWidget->setCurrentIndex(cur);
}

这段代码动态创建一个FormDoc类对象aform,并设置其为关闭时删除。然后使用 QTabWidget的addTab()函数,为主窗口上的tabWidget新建一个页面,作为aform的父窗体组件,aform就在新建的页面里显示,我们称这种窗体显示方式为“嵌入式”。

新建独立子窗口

主窗口工具栏上的“新建独立Widget窗口”按钮响应代码如下:

void MainWindow::on_actionAlone_triggered()
{
  FormDoc *aform=new FormDoc();
  aform->setAttribute(Qt::WA_DeleteOnClose);
  aform->setWindowFlag(Qt::Window,true);
  aform->setWindowOpacity(0.8);
  aform->show();
}

这里在创建formDoc对象时,并没有指定父窗口,创建窗口的代码是

FormDoc *aform = new FormDoc();

使用setWindowFlag()函数,设置其为Qt::Window类型,并用show()函数显示窗口。这样创 建的是一个单独显示的窗口,并且在windows的任务栏上会有显示。若有文档窗口打开,则关闭主窗口后文档窗口依然存在,实际上这时候主窗口是隐藏了。此时关闭所有文档窗口,主窗口自动删除并释放,才完全关闭应用程序。

如果创建formDoc时指定主窗口为父窗口,即:

FormDoc *aform = new FormDoc(this);

则aform不会在windows的任务栏上显示,关闭主窗口时,所有文档窗口自动删除。

在创建独立的显示窗口时,还可以尝试使用setWlndowFlag()函数设置不同的属性,观察这些属性的控制效果。