Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt:在这种情况下,应该使用什么布局或布局组合?_Qt_Qwidget_Qlayout - Fatal编程技术网

Qt:在这种情况下,应该使用什么布局或布局组合?

Qt:在这种情况下,应该使用什么布局或布局组合?,qt,qwidget,qlayout,Qt,Qwidget,Qlayout,我正在从事一个Qt项目,为此项目,我需要设计如下内容: 到目前为止,我已经在Qt Creator中进行了设计,并且我已经准备好了组件,但是当我尝试在不同的布局中添加小部件时,我没有得到我想要的形状。我应该怎么做才能调整我的应用程序的大小 捕获: 边栏有固定的宽度,这意味着对于窗口大小的水平增量,边栏的水平宽度不会增加。边栏本身就是一个小部件 上横杆的垂直宽度是固定的(如果可能)。这意味着,在垂直窗口大小增加期间,上横杆不能垂直变宽。它本身也是一个小部件 侧边栏旁边的小部件位于qstacked

我正在从事一个Qt项目,为此项目,我需要设计如下内容:

到目前为止,我已经在Qt Creator中进行了设计,并且我已经准备好了组件,但是当我尝试在不同的布局中添加小部件时,我没有得到我想要的形状。我应该怎么做才能调整我的应用程序的大小

捕获:

  • 边栏有固定的宽度,这意味着对于窗口大小的水平增量,边栏的水平宽度不会增加。边栏本身就是一个小部件
  • 上横杆的垂直宽度是固定的(如果可能)。这意味着,在垂直窗口大小增加期间,上横杆不能垂直变宽。它本身也是一个小部件
  • 侧边栏旁边的小部件位于
    qstackedwidget
嵌套布局: (绿色方块=)

步骤: [定义]

H(x,y,…)=x,y,….上的水平布局。。。;其中x,y。。。是小部件(W)还是布局(L)

V(x,y,…)=x,y,….上的水平布局。。。;其中x,y。。。是小部件(W)还是布局(L)

  • 第1步:V(W1,W2)=L1
  • 第二步:H(W3,L1)=L2
  • 第三步:V(W4,L2)=L3
  • 步骤4:将L3设置为StackedWidget的当前页面的布局
  • 步骤5:H(W5,StackedWidget)=L4
  • 第6步:H(W6,一个间隔垫圈,W7)=L5
  • 第7步:V(L5、L4)
请注意,W6W7的水平大小是固定的(或在其上设置最大值),它们之间的大小是布局L5中唯一可调整大小的小部件


下面是层次结构:


只是为了好玩,代码版本,使用最少的优化代码

#include "mainwindow.h"

#include <QBoxLayout>
#include <QLabel>
#include <QStackedWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
// Ingredients (taken from the mockup from top-left to bottom-right)
QFrame *upperBar = new QFrame;
QLabel *upperIcon = new QLabel("icon");
QLabel *profilePicture = new QLabel("profile picture");

QFrame *sideBar = new QFrame;
QLabel *sideItemA = new QLabel("Item A");
QLabel *sideItemB = new QLabel("Item B");

QStackedWidget *contentStack = new QStackedWidget;

QFrame *contentPage1 = new QFrame;
QLabel *page1WidgetA = new QLabel("I am widget A");
QLabel *page1WidgetB = new QLabel("I am widget B");
QLabel *page1WidgetC = new QLabel("I am widget C");
QLabel *page1WidgetD = new QLabel("I am widget D");

QWidget *centralWidget = new QWidget;

// The needed layouts:
QHBoxLayout *upperBarLayout = new QHBoxLayout;
QVBoxLayout *sideBarLayout = new QVBoxLayout;
QGridLayout *page1GridLayout = new QGridLayout;
QGridLayout *centralLayout = new QGridLayout;

// Let's connect the pieces:

/* First we setup the upperbar: */
upperBarLayout->addWidget(upperIcon, 1, Qt::AlignLeft);
upperBarLayout->addWidget(profilePicture, 3, Qt::AlignRight);
upperBar->setLayout(upperBarLayout);
upperBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

/* Then we setup the sidebar: */
sideBarLayout->addWidget(sideItemA);
sideBarLayout->addWidget(sideItemB);
sideBarLayout->addStretch();
sideBar->setLayout(sideBarLayout);
sideBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);

/* Then we setup the content stacked widget */
page1GridLayout->addWidget(page1WidgetA, 0, 0, 3, 1);
page1GridLayout->addWidget(page1WidgetB, 0, 1, 1, 1);
page1GridLayout->addWidget(page1WidgetC, 1, 1, 2, 1);
page1GridLayout->addWidget(page1WidgetD, 3, 0, 1, 2);
contentPage1->setLayout(page1GridLayout);

contentStack->addWidget(contentPage1);
contentStack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

/* Finally we setup the main elements into the central layout... */
centralLayout->addWidget(upperBar, 0, 0, 1, 2);
centralLayout->addWidget(sideBar, 1, 0, 1, 1);
centralLayout->addWidget(contentStack, 1, 1, 1, 1);
centralWidget->setLayout(centralLayout);
setCentralWidget(centralWidget);

/* Let's color it a little to better realize the positioning: */
setStyleSheet("QWidget {"
              "border: 1px solid black;"
              "color: red"
              "}");
}

MainWindow::~MainWindow()
{

}
#包括“mainwindow.h”
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
{
//成分(从左上到右下取自模型)
QFrame*上横杆=新QFrame;
QLabel*upperIcon=新的QLabel(“图标”);
QLabel*profilePicture=新的QLabel(“配置文件图片”);
QFrame*侧栏=新QFrame;
QLabel*sideItemA=新的QLabel(“项目A”);
QLabel*sideItemB=新的QLabel(“项目B”);
QStackedWidget*contentStack=新的QStackedWidget;
QFrame*contentPage1=新QFrame;
QLabel*page1WidgetA=新的QLabel(“我是小部件A”);
QLabel*page1WidgetB=新的QLabel(“我是小部件B”);
QLabel*page1WidgetC=新的QLabel(“我是小部件C”);
QLabel*page1WidgetD=新的QLabel(“我是widget D”);
QWidget*centralWidget=新的QWidget;
//所需的布局:
QHBoxLayout*upperBarLayout=新的QHBoxLayout;
QVBoxLayout*侧边栏布局=新的QVBoxLayout;
QGridLayout*page1GridLayout=新QGridLayout;
QGridLayout*centralLayout=新的QGridLayout;
//让我们把这些部分连接起来:
/*首先,我们设置上栏:*/
upperBarLayout->addWidget(upperIcon,1,Qt::AlignLeft);
upperBarLayout->addWidget(profilePicture,3,Qt::AlignRight);
upperBar->setLayout(upperBarLayout);
大写->设置策略(QSizePolicy::Expansing,QSizePolicy::Fixed);
/*然后我们设置侧边栏:*/
sideBarLayout->addWidget(sideItemA);
sideBarLayout->addWidget(sideItemB);
边栏布局->添加拉伸();
边栏->设置布局(边栏布局);
边栏->设置策略(QSizePolicy::固定,QSizePolicy::扩展);
/*然后我们设置内容堆叠小部件*/
page1GridLayout->addWidget(page1WidgetA,0,0,3,1);
page1GridLayout->addWidget(page1WidgetB,0,1,1,1);
page1GridLayout->addWidget(page1WidgetC,1,1,2,1);
page1GridLayout->addWidget(page1WidgetD,3,0,1,2);
contentPage1->setLayout(page1GridLayout);
contentStack->addWidget(contentPage1);
contentStack->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
/*最后,我们将主要元素设置到中心布局中*/
centralLayout->addWidget(上栏,0,0,1,2);
centralLayout->addWidget(边栏,1,0,1,1);
centralLayout->addWidget(contentStack,1,1,1);
centralWidget->setLayout(centralLayout);
setCentralWidget(centralWidget);
/*让我们将其涂上一点颜色,以便更好地实现定位:*/
setStyleSheet(“QWidget{”
“边框:1px纯黑;”
“颜色:红色”
"}");
}
MainWindow::~MainWindow()
{
}
结果如下:

有什么方法可以使widget_5具有固定大小?我可以让widget_1、widget_2、widget_3、widget_4成为堆栈窗口的一部分吗?什么是“堆栈窗口”呢?堆栈窗口应该是“堆叠的”,而在图片中,widget_1~4是“分开的”。@ShakibAhmed如果你试图制作一个新的布局,其中widget_1~4一起放置在堆栈窗口中,答案是肯定的。但是在你的问题中,你应该问堆叠窗口的版本,而不是当前的版本。对不起,首先对不起,因为我写了堆叠窗口,我指的是堆叠小部件。(犯错误是人类的)第二,是的,我应该在我的问题中写下这句话。很好的解释和我的ui工作!Qt布局第一次看起来很简单!我希望边栏的宽度至少是固定的。如果可能的话,上杆的宽度。我该怎么办?这种设计在web框架下很容易实现,QT可以做到吗?是的,QT可以做到。这使得我以前的答案完全过时了,我将对其进行编辑,也许您也应该删除以前的版本并将其清楚地表达出来,从而对您的问题进行编辑。你不应该再做这种事情了,这是一个非常糟糕的行为。我猜,非常抱歉,因为侧边栏通常是固定宽度的,我不必在这里明确提及。我错了。我已将我的答案更新为堆叠小部件的版本,请检查并查看是否有任何进一步的问题。此外,边栏应该提供一些相应的信号,以便在
QStackedWidget
的不同页面之间切换。