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

5

我正在尝试在Qt布局中使小部件部分重叠。 我当前的布局如下,使用包含四个QHBoxLayout子项的QVBoxLayout实现:

My current layout, achieved with a QVBoxLayout containing four QHBoxLayout children

我正在尝试重新组合同一花色的卡片,以实现类似于这样的效果(请注意,存在水平和垂直重叠):

This is the kind of overlapping I'm trying to achieve

很不幸,我阅读的所有Qt文档和Stack Overflow帖子都试图避免小部件重叠,而不是寻求它。也许有一种方法可以在小部件之间设置负间距,或者强制布局计算最大宽度(例如根据此情况下一套卡片的数量)?还是我必须创建自定义布局?也许我根本不应该使用布局?如果这有任何帮助,我正在使用类似以下代码向布局添加小部件:
hLayout[card.getSuit()-1]->addWidget(cardWidget, 0, align);
1个回答

7
你需要实现一个 QLayout 的子类。在QT文档中有一个详细的例子,可以解决你的问题:布局管理 基本上,你需要定义以下内容:
- 一个数据结构来存储布局处理的项。每个项是QLayoutItem。 - addItem(),用于将项目添加到布局中。 - setGeometry(),用于执行布局。 - sizeHint(),布局的首选大小。 - itemAt(),用于遍历布局。 - takeAt(),用于从布局中删除项目。
在大多数情况下,你还需要实现 minimumSize()。
下面是示例代码中最重要的部分,供你参考:
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;
    }
}

我简直不敢相信我之前没看到过这个。谢谢你提供的链接和额外的细节! - juef
这些构造函数无法编译。 - Gerard097

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接