QPushButton在第二个布局中不可单击

问题描述

有人已经问过类似的问题,但是那个人正在与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(),它使要添加的布局中的小部件成为父项。这样,父级布局就可以控制小部件的大小并确定应定向到小部件的事件(鼠标悬停事件,鼠标按下事件等)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...