0

我只是一个初学者,我想知道是否可以在 Mac 上创建一个表单小部件,就像 iTunes 中的信息对话框一样。

我尝试使用:

  • QGroupBox:我找不到摆脱框架的方法。
  • 创建我自己的小部件:我找不到使用 QVBoxLayout 修复标签和 QLineEdit 小部件之间间距的方法(实际上我不确定我是否理解边距/间距之间的差异)。
  • QFormLayout:使用 setrowWrapPolicy::WrapAllRows 后,我找不到减小 QLabel 大小的方法

另外我(还)对 QtDesigner 不太满意,所以我想(暂时)使用它

提前致谢

编辑:程序的一些精度。我在 Mac OS X Mountain Lion 上使用 QtCreator 2.6.1 和 Qt 4.8.1 和 5.0。

编辑2:这是代码。

QWidget 的子类:

MCLineEdit::MCLineEdit(const QString &header)
{
    m_lineEdit = new QLineEdit;
    m_lineTitle = new QLabel(header);

    QVBoxLayout *layout = new QVBoxLayout;        
    layout->addWidget(m_lineTitle);
    layout->addWidget(m_lineEdit);
    layout->setSpacing(0);
    setLayout(layout);
}

显示小部件

myView::myView(QWidget *parent) :
QWidget(parent)
{
    setFixedSize(600, 500);
    MCLineEdit *lineEdit1 = new MCLineEdit("Test 1");
    MCLineEdit *lineEdit2 = new MCLineEdit("Test 2");
    MCLineEdit *lineEdit3 = new MCLineEdit("Test 3");
    MCLineEdit *lineEdit4 = new MCLineEdit("Test 4");

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(lineEdit1);
    mainLayout->addWidget(lineEdit2);
    mainLayout->addWidget(lineEdit3);
    mainLayout->addWidget(lineEdit4);
    mainLayout->setSpacing(0);

    setLayout(mainLayout);
}
4

2 回答 2

2

我敢肯定,这可以通过很多方式完成。Qt 为您提供了实现这一目标所需的所有可能的布局。您可以使用QGridLayout, 并添加具有不同数量的“单元格”跨度的小部件,并控制行和列大小以适应。或者你可以用一堆嵌套的垂直/水平布局来做到这一点。

例如,您可以在 a 中将标签和字段组合在一起QVBoxLayout,方法是添加左对齐的小部件,然后将项目之间的间距设置为 0:

layout->setSpacing(0);
layout->addWidget(aLabel, Qt::AlignLeft);
layout->addWidget(aLineEdit, Qt::AlignLeft);

mainVerticalLayout->addLayout(layout);

对于像轨道号这样的东西,它只是更多的嵌套布局:

vLayout->addWidget(aLabel);
hLayout->addWidget(aCheckbox);
hLayout->addWidget(aLabel);
hLayout->addWidget(aCheckbox);
vLayout.addLayout(hLayout);

关于你的要点:

  1. QGroupBox 让你删除框架setFlat(bool)
  2. 对于布局,边距是包含的小部件外部的填充。您想要的是setSpacing(int)控制布局中项目之间的空间量。
  3. QFormLayout在这里可能不是您的最佳选择。这通常是为了在一侧有标签,在另一侧有小部件。基本上它是一个 2 列布局。QGridLayout 会更合适。并且要减小 的大小QLabel,您可以给它一个最大或固定大小。比如在标签上使用setFixedWidth()或。setMaximumWidth()
于 2013-01-04T01:09:00.833 回答
1

所以我在玩了一下QtCreator之后终于得到了预期的结果。

以下是可能感兴趣的人的代码:

myLineEdit:myLineEdit(const QString &header)
{
m_lineEdit = new QLineEdit;
m_groupBox = new QGroupBox;

QFont groupFont;
groupFont.setPixelSize(10);
groupFont.setBold(true);
m_groupBox->setTitle(header);
m_groupBox->setFlat(true);
m_groupBox->setFont(groupFont);
m_groupBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

QFont lineFont;
lineFont.setPixelSize(13);
lineFont.setBold(false);
m_lineEdit->setFont(lineFont);

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(m_lineEdit);
layout->setContentsMargins(0, 10, 0, 0);
layout->setSpacing(10);
layout->setSizeConstraint(QLayout::SetMinAndMaxSize);
m_groupBox->setLayout(layout);

QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addWidget(m_groupBox);
setLayout(mainLayout);
}

不过有一条评论:仅适用于 Qt 5,因为在 4.8 上,setFlat() 方法将在标题和 QLineEdit 之间显示一条分隔线。

感谢 jdi 的帮助!

于 2013-01-10T00:37:48.863 回答