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

时间:2012-09-08 02:38:25

标签: macos qt qt-creator

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

QVBoxLayout
  QTableView
  QPushButton

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

Magic padding caused by QPushButton

当我删除按钮时,表格视图返回其全宽:

No magic padding here

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

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

4 个答案:

答案 0 :(得分:1)

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

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

enter image description here

这是QWidget的布局属性:

enter image description here

这是最终的小部件:

enter image description here

答案 1 :(得分:0)

经过一些实验,我发现它使用QToolButton而不是QPushButton按预期工作。这不是解释,但它是一个解决方案。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

保留按钮外观的另一种解决方法是将布局放在QFrame容器窗口小部件中,并在样式表中设置负填充。容器必须是QFrame或填充不能工作。