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

标签 c++ qt layout overlap qlayout

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

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);

最佳答案

您需要实现 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;
    }
}

关于c++ - 使小部件在 Qt 布局中部分重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43968622/

相关文章:

c++ - 使用 Boost.Thread 编译 C++ 源文件

c++ - static const 和 constexpr 变量有什么区别?

c++ - 没有 cruft 的 C++ "in"运算符?

Qt:QTreeView:标题上的中心图标

wpf - 如何使用网格或其他控件在 WPF 中布局表单以实现可维护性

java - 如何在ListView中使用约束布局

c++ - 无法将 PFX 导入 Microsoft 示例 key 存储提供程序(加密提供程序开发工具包)

c++ - Qt 4.6 + MinGW : suppress warnings for generated code

python - 关于 PyQt 示例程序

javascript - 将元素设置在指定容器的中间