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

Posted

技术标签:

【中文标题】QPushButton 更改同一布局中其他小部件的边距【英文标题】:QPushButton changes margins on other widgets in the same layout 【发布时间】:2012-09-08 02:38:24 【问题描述】:

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

QVBoxLayout
  QTableView
  QPushButton

我将布局上的边距、内边距和间距设置为 0。在 Mac OS X 上呈现的方式是,按钮不会填满其所有空间。相反,它周围有一些填充物。神奇的是,布局似乎知道这一点,并确保表格视图的宽度与按钮的宽度完全一样:

当我移除按钮时,表格视图恢复到全宽:

如何更改它以使按钮以及表格视图变得与布局一样宽?

我已经使用了样式表的内边距和边距,虽然我可以使用它们来使按钮更宽,但树视图周围的额外内边距仍然存在。到目前为止,我唯一的解决方案是将按钮包装在另一个小部件中,然后通过样式表将其边距和填充设置为 0,但随后我失去了圆形外观。

【问题讨论】:

【参考方案1】:

您必须将布局边距设置为 0,而不是 QPushButton 的边距。

看看。这是设计师的外观和感觉:

这是 QWidget 的布局属性:

这是最终的小部件:

【讨论】:

遗憾的是我无法在 mac 上测试它,但如果你说它不起作用可能与 Mac 风格有关。Qt says:There are two approaches to creating a custom style. In the static approach, you either choose an existing QStyle class, subclass it, and reimplement virtual functions to provide the custom behavior, or you create an entire QStyle class from scratch. In the dynamic approach, you modify the behavior of your system style at runtime. The static approach is described below. The dynamic approach is described in QProxyStyle. QPushButton(和 QCheckBox)在 Mac OS 上打破边距。所以这是Mac相关的问题。问题应该有一些#mac标签。 我添加了#osx 标签。【参考方案2】:

经过更多实验后,我发现使用 QToolButton 而不是 QPushButton 可以正常工作。这不是解释,而是解决方案。

【讨论】:

QToolButton 和 QPushButton 在 Mac OS 上看起来不同。【参考方案3】:

嗯。有趣的。以下代码用于测试您的问题,但找不到任何问题。它按原样工作。(在 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();

【讨论】:

添加testerLay-&gt;setContentsMargins(0,0,0,0);controllerLay-&gt;setContentsMargins(0,0,0,0);查看问题。【参考方案4】:

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

【讨论】:

以上是关于QPushButton 更改同一布局中其他小部件的边距的主要内容,如果未能解决你的问题,请参考以下文章

更改按钮文本时如何自动更改 QPushButton 宽度和 QMenuBar 角小部件宽度?

如何在 Qt 的 qgrid 布局中获取小部件的坐标

如何在 androidx 抽屉布局小部件中更改字体大小和颜色

QT5.4 删除和删除布局中的小部件

如何将 QPushButton 放入小部件中的 Qt3DWindow 中?

如何通过鼠标拖放来更改布局中小部件的顺序?