首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使小部件在Qt布局中部分重叠

使小部件在Qt布局中部分重叠
EN

Stack Overflow用户
提问于 2017-05-14 20:42:49
回答 1查看 3.5K关注 0票数 4

我试图在Qt布局中使小部件部分重叠。我当前的布局如下所示,它使用一个包含四个QVBoxLayoutQHBoxLayoutQHBoxLayout实现:

为了实现这样的目标(请注意,存在横向和纵向重叠),我正在尝试重新组合同一套西装的卡片:

不幸的是,我读过的所有Qt文档和所有Stack溢出帖子都试图避免小部件的重叠,而不是去寻找它。也许有一种方法可以在小部件之间设置负间距,或者强制布局具有最大宽度(例如,根据一套卡的数量(在这种情况下))?还是必须创建自定义布局?也许我根本不应该使用布局?

如果有任何帮助,我将使用如下代码将这些小部件添加到布局中:

代码语言:javascript
运行
复制
hLayout[card.getSuit()-1]->addWidget(cardWidget, 0, align);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-14 22:24:45

您将需要实现QLayout的子类。QT文档中有一个解决问题的详细示例:布局管理

基本上,您需要定义以下内容:

  • 存储由布局处理的项的数据结构。每个项目都是一个QLayoutItem。
  • addItem(),如何将项添加到布局中。
  • setGeometry(),如何执行布局。
  • sizeHint(),布局的首选大小。
  • itemAt(),如何遍历布局。
  • takeAt(),如何从布局中删除项。

在大多数情况下,您还将实现minimumSize()。

为了您的方便,下面我复制了示例中最重要的代码部分:

代码语言:javascript
运行
复制
class CardLayout : public QLayout
{
public:
    CardLayout(QWidget *parent, int dist): QLayout(parent, 0, dist) {}
    CardLayout(QLayout *parent, int dist): QLayout(parent, dist) {}
    CardLayout(int dist): QLayout(dist) {}
    ~CardLayout();

    void addItem(QLayoutItem *item);
    QSize sizeHint() const;
    QSize minimumSize() const;
    int count() const;
    QLayoutItem *itemAt(int) const;
    QLayoutItem *takeAt(int);
    void setGeometry(const QRect &rect);

private:
    QList<QLayoutItem*> list;
};


void CardLayout::setGeometry(const QRect &r)
{
    QLayout::setGeometry(r);

    if (list.size() == 0)
        return;

    int w = r.width() - (list.count() - 1) * spacing();
    int h = r.height() - (list.count() - 1) * spacing();
    int i = 0;
    while (i < list.size()) {
        QLayoutItem *o = list.at(i);
        QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h);
        o->setGeometry(geom);
        ++i;
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43968622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档