Qt:带有 Qwidget 窗口容器的布局

Posted

技术标签:

【中文标题】Qt:带有 Qwidget 窗口容器的布局【英文标题】:Qt: layouts with a Qwidget window container 【发布时间】:2018-04-07 07:47:51 【问题描述】:

我有一个在 QWidget 中显示 QML 映射的应用程序。 Qwidget 构成了带有拆分器的水平布局的一部分,以允许地图占据大部分空间。我的 UI 结构如下图所示。

wdgtMap 是用作窗口容器的那个。如果我将文本编辑放在那里(在设计器中),文本编辑会按预期填充小部件并随着应用程序的大小调整和最大化而扩展。

如果现在在代码中,我为地图创建窗口容器,地图不会扩展到 wdgtMap 的大小。我尝试了许多不同的选择,但无济于事。

qmlMapObject = qvMap->rootObject();
// Set the context and include properties.
QQmlContext *ctxt = qvMap->rootContext();
ctxt->setContextProperty("asset_class", &clAsset);
// Set the source after defining the context.
qvMap->setSource(QUrl("qrc:/main.qml"));
// Set widget properties.
QWidget *qvMapContainer = QWidget::createWindowContainer(qvMap, ui->wdgtMap);
qvMapContainer->setMinimumSize(20,20);
qvMapContainer->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding);

在私有部分下的头文件中:

QQuickView *qvMap = new QQuickView();
QObject *qmlMapObject;

第二张图片是我最终得到的。你可以看到右上角的小地图。我希望它填充所有空间并在调整应用大小时扩展/缩小。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

使用以下指令:

QWidget *qvMapContainer = QWidget::createWindowContainer(qvMap, ui->wdgtMap);

您只是创建了一个名为qvMapContainer 的小部件,其内容为qvMap,并且作为父级ui->wdgtMap,一个小部件是另一个小部件的子级,仅确定该小部件的位置相对于父级,因此地图建立在左上角,每个widget的初始位置都是(0, 0)。

如果你想让一个小部件占据父级的大小,你必须通过布局来做到这一点。

qmlMapObject = qvMap->rootObject();
// Set the context and include properties.
QQmlContext *ctxt = qvMap->rootContext();
ctxt->setContextProperty("asset_class", &clAsset);
// Set the source after defining the context.
qvMap->setSource(QUrl("qrc:/main.qml"));
// Set widget properties.
QWidget *qvMapContainer = QWidget::createWindowContainer(qvMap);
QVBoxLayout *lay = new QVBoxLayout(ui->wdgtMap);
lay->addWidget(qvMapContainer);

【讨论】:

好的,所以这对我来说不是开箱即用的。原因是 wdgtMap 已经在 UI Designer 表单中分配了布局。请参阅初始帖子中的图像。您可以看到 wdgtMap 有一个布局。因此,在返回 UI 并删除该布局后,该解决方案有效,非常感谢您的帮助。 @Mikkie 我刚看到,很可疑,我建议其他问题提供.ui,所以我会观察的。 :D

以上是关于Qt:带有 Qwidget 窗口容器的布局的主要内容,如果未能解决你的问题,请参考以下文章

QT QMainWindow窗口中添加 QWidget容器类 应该怎么添加?

Qt 计算器界面实现

Qt--对话框及其类型布局管理器

请教QT中多语言切换,lupdate提取字符串不成功的问题

QT+创建两个不相干的窗口实现一个显示一个不显示

qt5如何定义一个全局窗口对象呀,就是可以在不同的cpp文件里面调用的