5

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

QVBoxLayout
  QTableView
  QPushButton

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

QPushButton 引起的魔法填充

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

这里没有魔法填充

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

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

4

4 回答 4

1

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

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

在此处输入图像描述

这是 QWidget 的布局属性:

在此处输入图像描述

这是最终的小部件:

在此处输入图像描述

于 2012-10-16T16:26:50.090 回答
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();
}
于 2012-10-21T08:33:55.530 回答
0

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

于 2012-10-21T01:14:56.567 回答
0

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

于 2015-07-21T22:38:09.960 回答