使小部件在 Qt 布局中部分重叠
Making widgets partly overlap in a Qt layout
我试图让小部件在 Qt 布局中部分重叠。我当前的布局如下,通过 QVBoxLayout containing four QHBoxLayout 个子节点实现:
我正在尝试重新组合相同花色的牌,以实现类似的效果(注意水平 和 垂直重叠):
不幸的是,我阅读的所有 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;
}
}
我试图让小部件在 Qt 布局中部分重叠。我当前的布局如下,通过 QVBoxLayout containing four QHBoxLayout 个子节点实现:
我正在尝试重新组合相同花色的牌,以实现类似的效果(注意水平 和 垂直重叠):
不幸的是,我阅读的所有 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;
}
}