C++ Qt-GUI小部件源文件的重构/分区

C++ Qt-GUI小部件源文件的重构/分区,c++,qt,refactoring,qtwidgets,C++,Qt,Refactoring,Qtwidgets,我创建了一个传统的Qt(基于小部件)GUI,类似这样:MainWindow::MainWindow(父):QMainWindow(父) Qt Creator将其设计为表单(mainwindow.ui),也称为设计模式。一切正常。但是包含所有窗口小部件的GUI代码、初始化相应的模型和功能变得很长。我想重构成小单元。我想到的东西: 我尝试使用专门的(派生的)小部件。示例:创建的MyTableView::QTableView包含专用模型,以及模型和小部件之间的信号/插槽处理。这将减少main窗口中的代

我创建了一个传统的Qt(基于小部件)GUI,类似这样:
MainWindow::MainWindow(父):QMainWindow(父)

Qt Creator将其设计为表单(
mainwindow.ui
),也称为
设计模式
。一切正常。但是包含所有窗口小部件的GUI代码、初始化相应的模型和功能变得很长。我想重构成小单元。我想到的东西:

  • 我尝试使用专门的(派生的)小部件。示例:创建的
    MyTableView::QTableView
    包含专用模型,以及模型和小部件之间的信号/插槽处理。这将减少
    main窗口中的代码量。但是,我确实失去了通过Qt Creator的设计模式设计GUI的能力
    
  • 到目前为止,我想到的最好的办法是将源代码(多个
    cpp
    文件)拆分。它仍然表示一个类,但一个文件中的代码更少

  • 那么,我怎样才能更好地划分GUI类呢?

    您可以创建自己的Qt小部件并向QtDesigner注册它们。然后,您将能够在表单上使用它们作为Qlabel和朋友。请参见

    您可以创建自己的Qt小部件并向QtDesigner注册它们。然后,您将能够在表单上使用它们作为Qlabel和朋友。请参见

    您可以创建自己的Qt小部件并向QtDesigner注册它们。然后,您将能够在表单上使用它们作为Qlabel和朋友。请参见

    您可以创建自己的Qt小部件并向QtDesigner注册它们。然后,您将能够在表单上使用它们作为Qlabel和朋友。在最近的一个项目中,我们有非常严格的解耦要求(尤其是不要与Qt联系太紧密)。我们过去基于类似MVC的模式所做的是:

    • 实现控制应用程序工作流的控制器
    • 为每个与控制器通信的屏幕添加GUI“适配器”类。比如说主屏幕类,第二屏幕类
    • 每个适配器类都包含给定数量的小部件:TimelineWidget、FormWidget
    • 每个小部件都由一个ui成员(ui::TimelineWidget ui)组成,该成员由使用Qt designer设计的.ui文件生成

    请注意,这种结构可能不适合小型项目。

    在最近的一个项目中,我们有非常严格的解耦要求(尤其是不要与Qt联系太紧密)。我们过去基于类似MVC的模式所做的是:

    • 实现控制应用程序工作流的控制器
    • 为每个与控制器通信的屏幕添加GUI“适配器”类。比如说主屏幕类,第二屏幕类
    • 每个适配器类都包含给定数量的小部件:TimelineWidget、FormWidget
    • 每个小部件都由一个ui成员(ui::TimelineWidget ui)组成,该成员由使用Qt designer设计的.ui文件生成

    请注意,这种结构可能不适合小型项目。

    在最近的一个项目中,我们有非常严格的解耦要求(尤其是不要与Qt联系太紧密)。我们过去基于类似MVC的模式所做的是:

    • 实现控制应用程序工作流的控制器
    • 为每个与控制器通信的屏幕添加GUI“适配器”类。比如说主屏幕类,第二屏幕类
    • 每个适配器类都包含给定数量的小部件:TimelineWidget、FormWidget
    • 每个小部件都由一个ui成员(ui::TimelineWidget ui)组成,该成员由使用Qt designer设计的.ui文件生成

    请注意,这种结构可能不适合小型项目。

    在最近的一个项目中,我们有非常严格的解耦要求(尤其是不要与Qt联系太紧密)。我们过去基于类似MVC的模式所做的是:

    • 实现控制应用程序工作流的控制器
    • 为每个与控制器通信的屏幕添加GUI“适配器”类。比如说主屏幕类,第二屏幕类
    • 每个适配器类都包含给定数量的小部件:TimelineWidget、FormWidget
    • 每个小部件都由一个ui成员(ui::TimelineWidget ui)组成,该成员由使用Qt designer设计的.ui文件生成

    请注意,此结构可能不适用于小型项目。

    如果您仍然希望通过派生小部件来解耦小部件的初始化,可以使用Qt designer中的“升级到…”选项。步骤:

  • 类MyTableView:publicQTableView{},因此表视图的初始化被移动到MyTableView的构造函数中
  • 在Qt设计器中,打开ui表单(MainWidow.ui),并在其上拖放QTableView
  • 鼠标右键点击QTableView,在提示菜单中,有一个“升级到”选项,打开它
  • 在“升级小部件”对话框中,指定自定义QTableView的类名和头文件,例如MyTableView、MyTableView.h。此步骤需要现有的自定义类和头文件
  • 借来一张照片:

    如果您仍然希望通过派生小部件来解除小部件初始化的耦合,可以使用Qt designer中的“升级到…”选项。步骤:

  • 类MyTableView:publicQTableView{},因此表视图的初始化被移动到MyTableView的构造函数中
  • 在Qt设计器中,打开ui表单(MainWidow.ui),并在其上拖放QTableView
  • 鼠标右键点击QTableView,在提示菜单中,有一个“升级到”选项,打开它
  • 在“升级小部件”对话框中,指定自定义QTableView的类名和头文件,例如MyTableView、MyTableView.h。此步骤需要现有的自定义类和头文件
  • 借来一张照片:

    如果您仍然希望通过派生小部件来解除小部件初始化的耦合,可以使用中的“升级到…”选项