问题描述
有人已经问过类似的问题,但是那个人正在与PyQt5和Designer一起工作,所以我找不到答案,因为我是从头开始使用C ++编写的。
我是Qt的初学者,我试图将两个QPushButton添加到特定布局的窗口中。 最初,我试图将它们添加到窗口中,如下图所示( this 是窗口, textBrowser 是QTextBrowser。按钮已经被正确初始化)。
在这种情况下,按钮可以正常工作:
auto content = new QWidget(this);
auto windowLayout = new QVBoxLayout(content);
windowLayout->addWidget(textBrowser);
windowLayout->addWidget(button1,Qt::AlignLeft);
windowLayout->addWidget(button2,Qt::AlignRight);
setCentralWidget(content);
但是,按钮是垂直堆叠的。我希望它们在水平方向上彼此相邻,因此我尝试将按钮添加到QHBoxLayout中,然后将其添加到现有的QVBoxLayout中:
auto content = new QWidget(this);
auto windowLayout = new QVBoxLayout(content);
windowLayout->addWidget(textBrowser);
auto buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(button1,Qt::AlignRight);
buttonLayout->addWidget(button2,Qt::AlignLeft);
windowLayout->addItem(buttonLayout);
setCentralWidget(content);
这些按钮出现在我希望的位置,但是不幸的是,即使它们未被禁用,它们也不再可以单击。
为什么会这样?我的理论是布局可能会覆盖按钮,因此我尝试先将QHBoxLayout添加到QVBoxLayout中,然后添加按钮,但是没有任何变化。
任何帮助或信息都将不胜感激。
解决方法
来自QLayout::addItem()
documentation:
函数
addItem()
通常不在应用程序代码中调用。至 将小部件添加到布局中,使用addWidget()
函数;添加一个 子布局,请使用相关的addLayout()
功能QLayout
子类。
因此,将addItem()
替换为addLayout()
将解决您的问题。
要回答为什么addItem()
有这种效果,您可以查看Qt's source code:
void QBoxLayout::addLayout(QLayout *layout,int stretch)
{
insertLayout(-1,layout,stretch);
}
void QBoxLayout::insertLayout(int index,QLayout *layout,int stretch)
{
Q_D(QBoxLayout);
if (!d->checkLayout(layout))
return;
if (!adoptLayout(layout))
return;
if (index < 0) // append
index = d->list.count();
QBoxLayoutItem *it = new QBoxLayoutItem(layout,stretch);
d->list.insert(index,it);
invalidate();
}
void QBoxLayout::addItem(QLayoutItem *item)
{
Q_D(QBoxLayout);
QBoxLayoutItem *it = new QBoxLayoutItem(item);
d->list.append(it);
invalidate();
}
与addItem()
相比,addLayout()
调用adoptLayout()
,它使要添加的布局中的小部件成为父项。这样,父级布局就可以控制小部件的大小并确定应定向到小部件的事件(鼠标悬停事件,鼠标按下事件等)