QPushButton在第二个布局中不可单击 某人已经问了一个类似的问题,但是那个人在和PyQT5和设计师一起工作,所以我不能找到答案,因为我在“从头开始”和C++中编码。
我是Qt的初学者,我正在尝试在特定布局的窗口中添加两个QpushButton。 首先,我尝试将它们添加到已经存在的QVBoxLayout窗口中,如下所示(这是窗口,textBrowser是QTextBrowser。按钮已经正确初始化) 在这种情况下,按钮工作正常:QPushButton在第二个布局中不可单击 某人已经问了一个类似的问题,但是那个人在和PyQT5和设计师一起工作,所以我不能找到答案,因为我在“从头开始”和C++中编码。,c++,qt,qt5,qpushbutton,qlayout,C++,Qt,Qt5,Qpushbutton,Qlayout,我是Qt的初学者,我正在尝试在特定布局的窗口中添加两个QpushButton。 首先,我尝试将它们添加到已经存在的QVBoxLayout窗口中,如下所示(这是窗口,textBrowser是QTextBrowser。按钮已经正确初始化) 在这种情况下,按钮工作正常: auto content = new QWidget(this); auto windowLayout = new QVBoxLayout(content); windowLayout->addWidget(textBrowse
auto content = new QWidget(this);
auto windowLayout = new QVBoxLayout(content);
windowLayout->addWidget(textBrowser);
windowLayout->addWidget(button1, 0, Qt::AlignLeft);
windowLayout->addWidget(button2, 0, 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, 0, Qt::AlignRight);
buttonLayout->addWidget(button2, 0, Qt::AlignLeft);
windowLayout->addItem(buttonLayout);
setCentralWidget(content);
按钮显示在我希望的位置,但不幸的是,即使它们没有被禁用,也无法再单击
为什么会发生这种情况?我的理论是布局可能会覆盖按钮,因此我尝试先将QHBoxLayout添加到QVBoxLayout,然后添加按钮,但没有任何改变
非常感谢您提供的任何帮助或信息。摘自
QLayout::addItem()
:
函数addItem()
通常不会在应用程序代码中调用。到
将小部件添加到布局中,使用addWidget()
函数;添加
子布局,使用相关组件提供的addLayout()
函数
QLayout
子类
因此,将addLayout()
替换为addLayout()
将解决您的问题
要回答为什么addItem()
具有这种效果,您可以查看:
void QBoxLayout::addLayout(QLayout*layout,int-stretch)
{
插入布局(-1,布局,拉伸);
}
void QBoxLayout::insertLayout(int索引、QLayout*布局、int拉伸)
{
Q_D(QBoxLayout);
如果(!d->检查布局(布局))
返回;
如果(!采用布局(布局))
返回;
if(索引<0)//追加
index=d->list.count();
QBoxLayoutItem*it=新的QBoxLayoutItem(布局、拉伸);
d->list.insert(索引,it);
使无效();
}
void QBoxLayout::addItem(QLayoutItem*item)
{
Q_D(QBoxLayout);
QBoxLayoutItem*it=新的QBoxLayoutItem(项目);
d->list.append(它);
使无效();
}
与
addItem()
相比,addLayout()
调用将重新分配要添加的布局中的小部件。这可以让父布局控制小部件的大小,并确定应该定向到小部件的事件(鼠标悬停事件、鼠标按下事件等)您是否尝试过使用addLayout()
而不是addItem()
?@ngocminnguyen非常感谢!!这解决了我的问题!你知道为什么addItem()
会有这样的效果吗?从文档来看:这个函数通常不会在应用程序代码中调用。要将小部件添加到布局,请使用addWidget()函数;要添加子布局,请使用相关QLayout子类提供的addLayout()函数。感谢您的详细解释。这对我帮助很大,因为Qt对我来说是新的。很高兴我能帮上忙!回答得很好!
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();
}