Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QPushButton在第二个布局中不可单击 某人已经问了一个类似的问题,但是那个人在和PyQT5和设计师一起工作,所以我不能找到答案,因为我在“从头开始”和C++中编码。_C++_Qt_Qt5_Qpushbutton_Qlayout - Fatal编程技术网

QPushButton在第二个布局中不可单击 某人已经问了一个类似的问题,但是那个人在和PyQT5和设计师一起工作,所以我不能找到答案,因为我在“从头开始”和C++中编码。

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

我是Qt的初学者,我正在尝试在特定布局的窗口中添加两个QpushButton。 首先,我尝试将它们添加到已经存在的QVBoxLayout窗口中,如下所示(这是窗口,textBrowser是QTextBrowser。按钮已经正确初始化)

在这种情况下,按钮工作正常:

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();
}