- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在手动创建一组 QLabel,这些 QLabel 将被放入 QGridLayout 中,并且应该均匀分布。当我使用 QT 设计器创建测试表单并添加一系列标签并将它们放在 QGridLayout 中时,标签占据了网格中其单元格的全部大小。当我在 C++ 中手动执行此操作时,标签不会展开并显示文本的最小大小。我能够让这些标签垂直扩展,但不能水平扩展。
这是我创建 QGridLayout 的方式:
m_layout = new QGridLayout;
m_layout->setHorizontalSpacing( 1 );
m_layout->setVerticalSpacing( 1 );
m_layout->setContentsMargins(0,0,0,0);
m_layout->setMargin(0);
m_layout->setSizeConstraint( QGridLayout::SetDefaultConstraint );
//m_layout->setSizeConstraint( QGridLayout::SetMaximumSize );
当我更改大小约束时,它根本不会影响标签的大小,因此我假设问题可能出在我如何创建标签上,它是这样发生的:
QLabel *label = new QLabel;
label->setAlignment( Qt::AlignCenter );
label->setFrameStyle( QFrame::Raised );
label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );
label->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
现在,所有 QLabel 的大小都相同,但最终它们会有不同的大小,这就是我使用 packed-bin 算法的原因。我围绕这样的类设计了算法:
struct ButtonFittingNode
{
ButtonFittingNode( QRect rectangle, QGridLayout *layout )
: used( false )
, node( rectangle )
, down( NULL )
, right( NULL )
, m_layout( layout )
{ }
~ButtonFittingNode()
{
if ( down ) delete down;
if ( right ) delete right;
}
ButtonFittingNode *findNode( QLabel *btn )
{
int w = 1;
int h = 1;
if ( this->used )
{
ButtonFittingNode *bfn = NULL;
if ( this->right ) bfn = this->right->findNode( btn );
if ( this->down && !bfn ) bfn = this->down->findNode( btn );
return bfn;
}
else if ( ( w <= node.width() ) && ( h <= node.height() ) )
{
qDebug() << "Placing at " << node.x() << node.y();
m_layout->addWidget( btn, node.y(), node.x(), w, h, Qt::AlignJustify );
this->used = true;
this->splitNode( QSize( w, h ) );
return this;
}
return NULL;
}
void splitNode( QSize sz )
{
int w = 0, h = 0;
// Create a down node
w = this->node.width();
h = this->node.height() - sz.height();
if ( h > 0 )
{
QRect n( this->node.x(), this->node.y() + sz.height(), w, h );
this->down = new ButtonFittingNode( n, m_layout );
}
// Create a right node
w = this->node.size().width() - sz.width();
h = sz.height();
if ( w > 0 )
{
QRect n( this->node.x() + sz.width(), this->node.y(), w, h );
this->right = new ButtonFittingNode( n, m_layout );
}
}
bool used;
QRect node;
ButtonFittingNode *down;
ButtonFittingNode *right;
private:
QGridLayout *m_layout;
};
使用 3x2 网格,我得到以下输出:
抱歉,我不得不模糊文本,因为这是一个与工作相关的项目,但灰色是背景,白色是标签的背景。如您所见,他们很高,但很瘦。我希望这些标签又高又胖。我是否设置了一些错误的属性?
最佳答案
这一切真的都很简单。布局的大小限制与您所看到的内容没有关系。您还包含了一堆无用的样板代码。摆脱对最小和最大尺寸的显式设置,除非你有一些非默认尺寸。这是完全没用的:
label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );
需要在水平方向设置标签的sizePolicy
为Expanding
。这就是它的全部:
label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
我明白您想要从您的装箱系统中得到什么,但它不会按原样工作得很好,因为网格中的列/行大小会随着网格大小的调整而变化。您的打包程序将根据当前行/列大小选择一些列/行跨度。调整大小后,打包程序的决策将不再适用。
您真正想要的是一个自定义布局,可以即时完成所有打包工作。 flow layout example可能非常接近您想要的。
关于c++ - 在 QGridLayout 中拉伸(stretch) QLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229542/
是否可以在另一个 QGridLayout 中包含 QGridLayouts?我一直在尝试使用 UI 设计器来执行此操作,以便我可以统一调整所有 QGridLayouts 的大小。 这是我为了好玩而创建
我正在尝试使 QGridLayout 可滚动。它可能包含几个自定义小部件,小部件的数量不固定。当有超过 x 个小部件时,QGridLayout 必须是可滚动的,x 是任意数字。 问题是,当我使用 QS
我一直在试图弄清楚小部件的坐标是如何到达的。例如在 qt 文档中,我想知道这是如何完成的。 QGridLayout *layout = new QGridLayout; layout->ad
问题说明了一切。 我有一个 5 x 3 的网格。 看起来像这样 row 0: buttonA--buttonA--buttonA nothing buttonB--buttonB--butt
我有一个 QGridLayout并且需要删除其所有按钮,然后重新创建它们。 我尝试使用 count() 循环布局其次是 takeAt()删除返回的 LayoutItem的小部件。然而,出于某种原因,我
我想用QWidgets填充QGridLayout。 QWidgets 需要以从左上到右上的方式显示,并在每行填充 QWidgets 后继续向下填充。类似且熟悉的 GUI 的一个例子是 Apple 如何
我正在尝试将 Qgridlayout 用于我的 GUI。我希望减小 Qspin 的宽度,如图所示。有什么建议我该怎么做吗?谢谢 layout.addWidget(checkBoxVBG,1,0
我有一个 QTableWidget 和 6 个 QPushBotton 我想以这种方式将它们放在一个布局中 只是按钮之间的小间距 但是使用 QGridLayout 让它看起来像这样 代码: t
我正在使用 QGridLayout 添加一个 QPushButton 和一个 QTextEdit。但每当我隐藏和删除 QTextEdit 小部件 时,QPushButton 就会出现在 QTextEd
我正在使用 Qt5.5 为我的项目构建图形用户界面并尝试使用 QGridLayout。 第一个来源 此代码按我预期的方式工作。 QGridLayout * layout = new QGridLayo
不幸的是,我找到的这个问题的答案对我不起作用。我想我在某个地方犯了错误...... 我想向 QGridLayout 添加内容: int rows = 2; int columns = 2; for(i
我正在尝试创建一个如下所示的布局: _________ | | | |1 | 2 | |__|______| | 3 | 4 | |____|____| 基本上,我希望第一行的
我目前有一个 QGridLayout 的问题。 每个方 block 都是一个小部件,我有一个这样的循环 for(int i = 0; i layout->addWidget(new Square(th
我正在尝试创建一个程序,让用户可以通过三个选项来回答问题。我为此使用了 QGridLayout,但只显示了最后添加到 QGridLayout 的小部件。 预期: ###################
我有一个 QGridLayout 来处理我的小部件。事实上,它们留在我放置的列中,而没有扩展整个宽度。是否有任何选项可以告诉行完全展开?目标是模仿 QHBoxLayout 的行为,但不使用 QHBox
我对 QGridLayout 有疑问。我的布局的一行包含一个通常隐藏的元素 (QProgressbar)。当有一些进展要报告时,我会调用它。问题是,当我在 QProgressbar 上调用 show
我有一个这样设置的对话框: 除标题外,每个组件的属性都设置为默认值。我希望包含 label_3 的行与其他三行的高度相同(为了清楚起见,底部的行将展开以占用剩余空间,如图所示)。问题是复选框与文本框的
我有一个按钮,后面跟着一个充满小部件的 QGridLayout。我想在每次单击按钮时显示/隐藏 QGridLayout,但是阅读 QGridLayout 的文档我发现没有 show()/hide ()
下面是如何绘制一个跨越两列的按钮: #include int main(int argv, char **args) { QApplication app(argv, args);
是否可以通过某种方式设置 QGridLayout 列可以扩展到的最大宽度? 如果我为列内的小部件设置最大宽度,即使达到小部件大小限制,该列也会继续增长。 我是 Qt 的新手,所以也许我遗漏了一些东西.
我是一名优秀的程序员,十分优秀!