QPushButton更改了同一布局中其他小部件的边距。

6

我有一个大的布局,其中包含以下结构的小部件和布局:

QVBoxLayout
  QTableView
  QPushButton

我将布局的边距、内边距和间距设置为0。在Mac OS X上呈现的方式是,按钮没有填满所有的空间。相反,在它周围有一些内边距。神奇的是,布局似乎知道这一点,并确保表视图与按钮的宽度完全相同:
当我移除按钮时,表视图返回到其完整的宽度:
我该如何更改它,使按钮和表格视图都变成与布局一样宽?
我尝试使用样式表的内边距和外边距进行调整,虽然可以用它们使按钮变宽,但树形视图周围的额外内边距仍然存在。我目前唯一的解决方案是将按钮包装在另一个小部件中,然后通过样式表将其边距和内边距设置为0,但这样会失去圆角的外观。
4个回答

1

你需要将布局边距设置为0,而不是QPushButton的边距。

看一下,这是设计师的外观和感觉:

enter image description here

这是QWidget的布局属性:

enter image description here

这是最终的小部件:

enter image description here


很遗憾我无法在Mac上测试它,但如果你说它不起作用,也许与Mac风格有关。Qt 创建自定义样式有两种方法。在静态方法中,您可以选择现有的QStyle类,对其进行子类化,并重新实现虚拟函数以提供自定义行为,或者从头开始创建整个QStyle类。在动态方法中,您可以在运行时修改系统样式的行为。下面介绍了静态方法。动态方法在QProxyStyle中描述。 - Alberto
1
QPushButton(和QCheckBox)在Mac OS上破坏了边距。因此,这是与Mac相关的问题。问题应该有一个#mac标签。 - Ivan Romanov
1
我添加了 #osx 标签。 - Dirk Groeneveld

0

另一个保留推按钮外观的解决方法是将布局放在QFrame容器小部件中,并在样式表中设置负填充。容器必须是QFrame,否则填充不起作用。


0
经过更多的实验,我发现使用 QToolButton 而不是 QPushButton 可以按预期工作。这并不是一个解释,但它是一个解决方案。

QToolButton和QPushButton在Mac OS上看起来不同。 - Ivan Romanov

0

嗯,有趣。以下代码用于测试您的问题,但找不到任何问题。它只是按原样工作(在Mac OSX上使用Qt 4.8.2)。该代码是自包含的,只需将其放置为main.cpp以构建应用程序,并单击显示和隐藏按钮进行测试。

#include <QtGui>

class FramedWidget : public QFrame
{
public:
    FramedWidget(QWidget* inner, QWidget* parent=0)
        : QFrame(parent)
    {
        setFrameStyle(QFrame::Panel | QFrame::Sunken);
        QVBoxLayout* lay = new QVBoxLayout(this);
        lay->setContentsMargins(0,0,0,0);
        lay->setSpacing(0);
        lay->addWidget(inner);
    }
};

class LayoutWidget : public QSplitter
{
public:
    LayoutWidget(QWidget* parent=0)
        : QSplitter(parent)
    {
        QTableWidget* table = new QTableWidget;
        m_button = new QPushButton("Testing...");
        QPushButton* showButton = new QPushButton("Show");
        QPushButton* hideButton = new QPushButton("Hide");
        connect(showButton, SIGNAL(clicked()),
                m_button, SLOT(show()));
        connect(hideButton, SIGNAL(clicked()),
                m_button, SLOT(hide()));

        QWidget* tester = new QWidget;
        QVBoxLayout* testerLay = new QVBoxLayout(tester);
        testerLay->addWidget(table);
        testerLay->addWidget(m_button);

        QWidget* controller = new QWidget;
        QVBoxLayout* controllerLay = new QVBoxLayout(controller);
        controllerLay->addWidget(showButton);
        controllerLay->addWidget(hideButton);
        controllerLay->addWidget(new QTextEdit);

        this->addWidget(new FramedWidget(controller));
        this->addWidget(new FramedWidget(tester));
    }
protected:
    QPushButton* m_button;
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    LayoutWidget* editor = new LayoutWidget;
    editor->show();
    editor->raise();
    return app.exec();
}

1
添加 testerLay->setContentsMargins(0,0,0,0);controllerLay->setContentsMargins(0,0,0,0); 以查看问题。 - Ivan Romanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接