Qt QGridLayout - 删除项目间距

时间:2014-08-29 00:47:46

标签: c++ qt

我正在尝试在Qt中编写战舰的实现,我正在使用两个QGridLayouts来包含用于代表玩家的QToolButtons'网格。顶级布局(QMainWindows one)是QHBoxLayout。我想要完成的是删除这些按钮之间的间距。这是它正在关注的时刻:

Grid

绝对不是很好。我正在将这些项目添加到这些布局中:

QIcon icon;
icon.addFile(QStringLiteral(":/images/Resources/field_blue.png"), QSize(), QIcon::Normal, QIcon::Off);
for (int i = 0; i < dimensions; ++i)
{
    for (int j = 0; j < dimensions; ++j)
    {
        QToolButton* buttonLeft = new QToolButton(this);
        buttonLeft->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        buttonLeft->setText(QString::number(i) + "-" + QString::number(j));
        buttonLeft->setFixedSize(FIELD_ICON_SIZE + 10, FIELD_ICON_SIZE + 10); // FIELD_ICON_SIZE -> 20
        buttonLeft->setIcon(icon);
        buttonLeft->setIconSize(QSize(FIELD_ICON_SIZE, FIELD_ICON_SIZE));
        buttonLeft->setAutoRaise(true);
        QToolButton* buttonRight = new QToolButton(this);
        buttonRight->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        buttonRight->setText(QString::number(i) + "-" + QString::number(j));
        buttonRight->setFixedSize(FIELD_ICON_SIZE + 10, FIELD_ICON_SIZE + 10);
        buttonRight->setIcon(icon);
        buttonRight->setIconSize(QSize(FIELD_ICON_SIZE, FIELD_ICON_SIZE));
        buttonRight->setAutoRaise(true);
        _ui.gridLayoutLeft->addWidget(buttonLeft, i, j);
        _ui.gridLayoutRight->addWidget(buttonRight, i, j);
    }
}

我可以尝试使用垫片,但是它们会留下空白点,这也是不可取的。

2 个答案:

答案 0 :(得分:5)

几乎总是在编程中有几种方法可以实现你想要的东西,所以我会给你解决方案,这只是另一种方法。 如果你想使用&#34;按钮&#34;作为游戏的瓷砖,你需要强大的风格,不仅要让它们看起来像你想要的特定平台中的特定主题,这就是你现在正在做的事情。 QToolButton的默认样式在Mac,Windows,Linux上不同,也不是自动上升效果的行为。这就是我建议完全控制按钮样式的原因。 我将提供一个非常基本的示例,您可以使用它来获取一些想法并将它们放入您的应用程序中。

首先,我决定使用QPushButton代替QToolButton s。填充左侧网格的代码如下:

// ...
for (int i = 0; i < dimensions; ++i)
{
    for (int j = 0; j < dimensions; ++j)
    {
        QPushButton* buttonLeft = new QPushButton(this);
        buttonLeft->setFixedSize(20, 20);
        QToolButton* buttonRight = new QToolButton(this);
        ui->gridLayoutLeft->addWidget(buttonLeft, i + 1, j + 1);

        // ...

    }
}

请注意,在将按钮添加到网格时,我已经更改了索引。这是因为我将保留稍后用于缩小按钮的垫片的第一行和第一列。

现在,让我们将布局间距设置为零:

ui->gridLayoutLeft->setSpacing(0);

并添加垫片:

enter image description here

    // Vertical spacers
    ui->gridLayoutLeft->addItem(new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding), 0, 0, 1, dimensions + 2);
    ui->gridLayoutLeft->addItem(new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding), dimensions + 1, 0, 1, dimensions + 2);

    // Horizontal spacers
    ui->gridLayoutLeft->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 1, 0, dimensions, 1);
    ui->gridLayoutLeft->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 1, dimensions + 1, dimensions, 1);

按钮现在尽可能是关节。

enter image description here

最后需要设置按钮的样式。为此,我更喜欢使用样式表。 (有关样式表的大量信息可以在Qt文档中找到:The Style Sheet SyntaxQt Style Sheets ReferenceQt Style Sheets Examples

QString styleSheet =
    "QPushButton {"
    "  background-color: blue;"
    "  border: none;"
    "}"
    "QPushButton:hover {"
      "background-color: lightblue;"
    "}"
    "QPushButton:pressed {"
      "background-color: red;"
    "}";
setStyleSheet(styleSheet);

这个简单样式表的结果是:

enter image description here enter image description here

你可以玩它直到你得到一个好的行为,你甚至可以模拟自动提升效果,但最重要的事实是,通过这种方法,你的游戏板应该在所有Qt支持的平台上看起来完全一样。

答案 1 :(得分:1)

您将按钮大小设置为大于图标大小。

buttonLeft->setFixedSize(FIELD_ICON_SIZE + 10, FIELD_ICON_SIZE + 10)
buttonLeft->setIconSize(QSize(FIELD_ICON_SIZE, FIELD_ICON_SIZE));

顺便说一下,QToolButton用于QToolBar。为什么不使用QPushButton呢?

抱歉,起初我想通过评论来解决上述问题,但我的声誉太低(^^;)

您可以调用setSpacing(0),但间距会按GQridLayout的大小调用。所以setSizeConstraint(QLayout::SetFixedSize)也是必要的(然后你不能改变小部件的大小)。 此方法适用于QPushButton,但不适用于QToolButton。似乎QToolButton代码中有一些填充(图标的大小似乎小于设置 - FIELD_ICON_SIZE * FIELD_ICON_SIZE)。