以编程方式设计GUI - 嵌套布局和多个小部件的良好实践(Qt)

时间:2016-09-23 21:41:49

标签: qt qt-creator qwidget qlayout

我有兴趣更好地理解 Qt ,为此我想 如何完成嵌套布局和多个小部件GUI的相对复杂的示例编程;即不使用Qt Creator的设计。

我见过几个示例代码,它们只是非常简单的布局,而且几乎没有使用头文件;实际上我见过的大部分例子中, dump 主要代码。这是我的理解(请纠正我,如果我错了)好的编程实践要求你将设计分开在一个单独的类(例如mainwindow)和main.cpp中你只是调用和{{1那个主窗口。也许,最关键的是,小部件,布局等的所有定义都应该在头文件中定义,然后在show中调用和自定义。

以编程方式精确编写良好的编程实践,但是可以看到相对简单的GUI设计here

如果有人可以提供在线资源,其中包含良好的程序化GUI设计的非简单代码示例,展示如何正确定义和自定义非常感谢的嵌套布局和小部件。< / p>

或者,这是一个简单的程序设计GUI设计示例,我可以从中获取代码(没有Designer),以便从中学习并获得理解:

注意:我的重点仅在于嵌套布局,多个小部件以及应在不同Qt源文件上定义和调用这些小部件的位置和方式。

enter image description here

这里可以看到嵌套布局和小部件细节:

enter image description here

使用实际的GUI结果,如下所示:

enter image description here

更新

正如迈克在评论部分所建议的,从uic可以看到设计师所做的代码,在我的例子中,上面提到的例子是以下

mainwindow.cpp输出:

>uic mainwindow.ui

1 个答案:

答案 0 :(得分:1)

以下是您可能希望执行的转换。我已经包含了一个缩短版的代码来演示。

  1. uic输出开始。

    class Ui_MainWindow
    {
    public:
        QWidget *centralWidget;
        QVBoxLayout *verticalLayout_3;
        QFrame *top_frame;
    };
    
  2. Ui_Foo的所有成员加入Foo本身,并保留其订单。

    class MainWindow : public QMainWindow
    {
        QWidget *centralWidget;
        QVBoxLayout *verticalLayout_3;
        QFrame *top_frame;
    };
    
  3. 将成员类型从指针更改为值。

    class MainWindow : public QMainWindow
    {
        QWidget centralWidget;
        QVBoxLayout verticalLayout_3;
        QFrame top_frame;
        ...
    };
    
  4. 在类声明中初始化布局,为它们提供它们所依赖的小部件。这使得用户界面的结构在标题本身中显而易见:

    class MainWindow : public QMainWindow
    {
        QWidget centralWidget;
        QVBoxLayout verticalLayout_3{&centralWidget};
        QFrame top_frame;
        ...
    };
    
  5. setupUi中的代码添加到构造函数的正文中,相应地更改它以对值进行操作,而不是指针:

    MainWindow::MainWindow(QWidget * parent) : QWidget{parent}
    {
        setObjectName(QStringLiteral("MainWindow"));
        resize(878, 632);
        centralWidget.setObjectName(QStringLiteral("centralWidget"));
        verticalLayout_3.setSpacing(6);
        verticalLayout_3.setContentsMargins(11, 11, 11, 11);
        verticalLayout_3.setObjectName(QStringLiteral("verticalLayout_3"));
        top_frame.setObjectName(QStringLiteral("top_frame"));
        QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);
        sizePolicy.setHeightForWidth(top_frame->sizePolicy().hasHeightForWidth());
        top_frame.setSizePolicy(sizePolicy);
        top_frame.setFrameShape(QFrame::StyledPanel);
        top_frame.setFrameShadow(QFrame::Raised);
        ...
    }