C++ 如何为小部件创建自定义布局

C++ 如何为小部件创建自定义布局,c++,qt,qwidget,C++,Qt,Qwidget,我正在尝试在QT中创建一个自定义小部件,其外观如下: 红色方块将显示一个图像/图标。 如何通过对小部件进行编码来实现这种布局?我需要创建许多具有相同布局但标签中的值不同的小部件。理想情况下,我会在主窗口中将这些小部件显示为带有滚动条的列表。但现在我正努力通过代码为这些小部件创建布局。非常感谢您的帮助。请使用此功能 QPixmap big(75,65); big.fill(Qt::red); QPixmap small(25,15); QVBoxLayout *box = new QVBoxL

我正在尝试在QT中创建一个自定义小部件,其外观如下:

红色方块将显示一个图像/图标。 如何通过对小部件进行编码来实现这种布局?我需要创建许多具有相同布局但标签中的值不同的小部件。理想情况下,我会在主窗口中将这些小部件显示为带有滚动条的列表。但现在我正努力通过代码为这些小部件创建布局。非常感谢您的帮助。

请使用此功能

QPixmap big(75,65);
big.fill(Qt::red);
QPixmap small(25,15);

QVBoxLayout *box = new QVBoxLayout;

QWidget *window = new QWidget;
QLabel *bigLab = new QLabel;
QLabel *smallLab = new QLabel;
QLabel *textLab = new QLabel("Two");
bigLab->setPixmap(big);
smallLab->setPixmap(small);

QHBoxLayout *hLay = new QHBoxLayout;
hLay->addWidget(bigLab);
hLay->addWidget(textLab);

QHBoxLayout *vLay = new QHBoxLayout;
vLay->addWidget(smallLab,0,Qt::AlignRight);

box->addLayout(hLay);
box->addLayout(vLay);

window->setLayout(box);
window->show();
结果:

使用这个

QPixmap big(75,65);
big.fill(Qt::red);
QPixmap small(25,15);

QVBoxLayout *box = new QVBoxLayout;

QWidget *window = new QWidget;
QLabel *bigLab = new QLabel;
QLabel *smallLab = new QLabel;
QLabel *textLab = new QLabel("Two");
bigLab->setPixmap(big);
smallLab->setPixmap(small);

QHBoxLayout *hLay = new QHBoxLayout;
hLay->addWidget(bigLab);
hLay->addWidget(textLab);

QHBoxLayout *vLay = new QHBoxLayout;
vLay->addWidget(smallLab,0,Qt::AlignRight);

box->addLayout(hLay);
box->addLayout(vLay);

window->setLayout(box);
window->show();
结果:


您需要将设计拆分为单独的段。每个段可以是单独的子布局或小部件。在您的示例中,我看到以下部分:

  • 大红色图标
  • 两个标签:TextLabel和2014年11月6日
  • 两个标签构成垂直框布局
  • 垂直框布局和大红色图标构成水平框布局
  • 红色小矩形构成一个单独的布局
  • 所有布局构成一个主布局
现在让我们编写此合成代码:

QLabel *largeRed = new QLabel(this); // Should set an image for this label
QLabel *lbl1 = new QLabel("06-November-2014...", this);
QLabel *lbl2 = new QLabel("TextLabel", this);

QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(lbl1);
vLayout->addWidget(lbl2);
vLayout->addStretch();

QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(largeRed);
hLayout->addLayout(vLayout);

QLabel *smallRed = new QLabel(this); // Should set an image for this label
QHBoxLayout *hLayout2 = new QHBoxLayout;
hLayout2->addWidget(smallRed, 0, Qt::AlignRight);

QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addLayout(hLayout);
mainLayout->addLayout(hLayout2);
[..]

您需要将设计拆分为单独的线段。每个段可以是单独的子布局或小部件。在您的示例中,我看到以下部分:

  • 大红色图标
  • 两个标签:TextLabel和2014年11月6日
  • 两个标签构成垂直框布局
  • 垂直框布局和大红色图标构成水平框布局
  • 红色小矩形构成一个单独的布局
  • 所有布局构成一个主布局
现在让我们编写此合成代码:

QLabel *largeRed = new QLabel(this); // Should set an image for this label
QLabel *lbl1 = new QLabel("06-November-2014...", this);
QLabel *lbl2 = new QLabel("TextLabel", this);

QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(lbl1);
vLayout->addWidget(lbl2);
vLayout->addStretch();

QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(largeRed);
hLayout->addLayout(vLayout);

QLabel *smallRed = new QLabel(this); // Should set an image for this label
QHBoxLayout *hLayout2 = new QHBoxLayout;
hLayout2->addWidget(smallRed, 0, Qt::AlignRight);

QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addLayout(hLayout);
mainLayout->addLayout(hLayout2);
[..]
我通常做的是:

  • 使用Qt Designer/Creator使用布局的丰富功能设计布局
  • 将其实例(从代码)设置为列表或表小部件的项小部件
  • 请小心,如果列表的项目计数太大,它将执行得非常慢

    另外,如果您真的需要对布局进行编码,只需使用Qt designer生成的代码。

    我通常做的是:

  • 使用Qt Designer/Creator使用布局的丰富功能设计布局
  • 将其实例(从代码)设置为列表或表小部件的项小部件
  • 请小心,如果列表的项目计数太大,它将执行得非常慢


    另外,如果您确实需要对布局进行编码,只需使用Qt designer生成的代码。

    我对您的答案投了赞成票,因为这需要花费很多时间,这一次不应忽略。我的速度稍微快一点并不重要,因为一直以来,您都在格式化代码,以便做得更好。谢谢!这使事情更加清楚。我对这个代码只有一个问题。如何更改lbl1和lbl2之间的间距。现在这两个标签之间的空间太大了。@testus,add
    vLayout->addStretch()呼叫vLayout。请查看我答案中的更新样本。我对你的答案投了赞成票,因为它需要花费很多时间,这一次不应该被忽略。我的速度稍微快一点并不重要,因为一直以来,您都在格式化代码,以便做得更好。谢谢!这使事情更加清楚。我对这个代码只有一个问题。如何更改lbl1和lbl2之间的间距。现在这两个标签之间的空间太大了。@testus,add
    vLayout->addStretch()呼叫vLayout。请查看我答案中的更新样本。它将把两个标签放在一起。