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

jue*_*uef 3 c++ layout qt overlap qlayout

我试图让部件在Qt布局中部分重叠.我的当前布局如下,使用包含四个QHBoxLayout节点的QVBoxLayout实现:

我目前的布局是用一个包含四个QHBoxLayout子节点的QVBoxLayout实现的

我正在尝试重新组合相同花色的卡片,以达到类似的效果(注意水平垂直重叠):

这是我想要实现的那种重叠

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

如果有任何帮助,我会将小部件添加到布局中,代码如下所示:

hLayout[card.getSuit()-1]->addWidget(cardWidget, 0, align);
Run Code Online (Sandbox Code Playgroud)

小智 6

您需要实现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;
    }
}
Run Code Online (Sandbox Code Playgroud)