我有兴趣更好地理解 Qt ,为此我想看 如何完成嵌套布局和多个小部件GUI的相对复杂的示例编程;即不使用Qt Creator的设计。
我见过几个示例代码,它们只是非常简单的布局,而且几乎没有使用头文件;实际上我见过的大部分例子中, dump 主要代码。这是我的理解(请纠正我,如果我错了)好的编程实践要求你将设计分开在一个单独的类(例如mainwindow
)和main.cpp
中你只是调用和{{1那个主窗口。也许,最关键的是,小部件,布局等的所有定义都应该在头文件中定义,然后在show
中调用和自定义。
以编程方式精确编写良好的编程实践,但是可以看到相对简单的GUI设计here。
如果有人可以提供在线资源,其中包含良好的程序化GUI设计的非简单代码示例,展示如何正确定义和自定义非常感谢的嵌套布局和小部件。< / p>
或者,这是一个简单的程序设计GUI设计示例,我可以从中获取代码(没有Designer),以便从中学习并获得理解:
注意:我的重点仅在于嵌套布局,多个小部件以及应在不同Qt源文件上定义和调用这些小部件的位置和方式。
这里可以看到嵌套布局和小部件细节:
使用实际的GUI结果,如下所示:
更新
正如迈克在评论部分所建议的,从uic可以看到设计师所做的代码,在我的例子中,上面提到的例子是以下
mainwindow.cpp
输出:
>uic mainwindow.ui
答案 0 :(得分:1)
以下是您可能希望执行的转换。我已经包含了一个缩短版的代码来演示。
从uic
输出开始。
class Ui_MainWindow
{
public:
QWidget *centralWidget;
QVBoxLayout *verticalLayout_3;
QFrame *top_frame;
};
将Ui_Foo
的所有成员加入Foo
本身,并保留其订单。
class MainWindow : public QMainWindow
{
QWidget *centralWidget;
QVBoxLayout *verticalLayout_3;
QFrame *top_frame;
};
将成员类型从指针更改为值。
class MainWindow : public QMainWindow
{
QWidget centralWidget;
QVBoxLayout verticalLayout_3;
QFrame top_frame;
...
};
在类声明中初始化布局,为它们提供它们所依赖的小部件。这使得用户界面的结构在标题本身中显而易见:
class MainWindow : public QMainWindow
{
QWidget centralWidget;
QVBoxLayout verticalLayout_3{¢ralWidget};
QFrame top_frame;
...
};
将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);
...
}