我正在尝试在Qt中编写战舰的实现,我正在使用两个QGridLayouts来包含用于代表玩家的QToolButtons'网格。顶级布局(QMainWindows one)是QHBoxLayout。我想要完成的是删除这些按钮之间的间距。这是它正在关注的时刻:
绝对不是很好。我正在将这些项目添加到这些布局中:
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);
}
}
我可以尝试使用垫片,但是它们会留下空白点,这也是不可取的。
答案 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);
并添加垫片:
// 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);
按钮现在尽可能是关节。
最后需要设置按钮的样式。为此,我更喜欢使用样式表。 (有关样式表的大量信息可以在Qt文档中找到:The Style Sheet Syntax,Qt Style Sheets Reference,Qt Style Sheets Examples)
QString styleSheet =
"QPushButton {"
" background-color: blue;"
" border: none;"
"}"
"QPushButton:hover {"
"background-color: lightblue;"
"}"
"QPushButton:pressed {"
"background-color: red;"
"}";
setStyleSheet(styleSheet);
这个简单样式表的结果是:
你可以玩它直到你得到一个好的行为,你甚至可以模拟自动提升效果,但最重要的事实是,通过这种方法,你的游戏板应该在所有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
)。