【问题标题】:Making widgets partly overlap in a Qt layout使小部件在 Qt 布局中部分重叠
【发布时间】:2017-10-13 14:19:40
【问题描述】:

我试图让小部件在 Qt 布局中部分重叠。我当前的布局如下,通过包含四个QHBoxLayout 子级的QVBoxLayout 实现:

我正在尝试重新组合相同花色的牌,以实现类似的效果(注意存在水平 垂直重叠):

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

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

hLayout[card.getSuit()-1]->addWidget(cardWidget, 0, align);

【问题讨论】:

    标签: c++ qt layout overlap qlayout


    【解决方案1】:

    您将需要实现 QLayout 的子类。 QT 文档中有一个详细示例可以解决您的问题:Layout Management

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

    • 用于存储布局处理的项目的数据结构。每个项目都是一个 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;
        }
    }
    

    【讨论】:

    • 我不敢相信我没有看到。感谢您提供链接和添加的详细信息!
    • 这些构造函数编译失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2013-02-12
    • 2013-08-09
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多