1

我需要一个按钮来填充或不填充QGridLayout创建按钮时单元格提供的整个空间(对齐值是从文件加载的)。我用下面的代码简化了我的情况。在运行时,用户可以设置按钮的对齐方式 - 使其填充整个布局单元或很好地居中。只要按钮没有以指定的 NULL 对齐方式开始,它就可以工作。然而,我需要能够从 NULL 对齐开始(即按钮填充布局单元格的空间)。最初与 NULL 对齐时,设置了什么以使按钮锁定到 AlignVCenter 设置,我怎样才能让按钮返回到像使用空对齐以外的其他东西进行初始化一样?

我在 Ubuntu 12.04 LTS 上使用 Qt 4.8

#include <QPushButton>
#include <QGridLayout>
#include <QMainWindow>
#include <QApplication>

class MyWidget : public QWidget {
    Q_OBJECT
    QPushButton* m_pb;
    QGridLayout* m_gl;
protected slots:
    void pbClicked();
public:
    MyWidget(QWidget* parent = 0);
};

MyWidget::MyWidget(QWidget* parent): QWidget(parent)
{
    m_pb = new QPushButton(tr("push me"));
    connect(m_pb, SIGNAL(clicked()), this, SLOT(pbClicked()));
    m_gl = new QGridLayout();
    //use (1) to see button expand when button is pressed
    //use (2) to show that I can't start off expanded
    /*1*/ //m_gl->addWidget(m_pb, 0, 0, Qt::AlignCenter); // creates desired effect
    /*2*/ //m_gl->addWidget(m_pb, 0, 0, 0); //does not create desired effect
    setLayout(m_gl);
}

void MyWidget::pbClicked(){
    //will expand button so long as initial alignment is not NULL
    m_gl->setAlignment(m_pb, 0);
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyWidget* widget = new MyWidget();
    QMainWindow window;
    window.setCentralWidget(widget);
    window.show();
    return app.exec();
}

#include "main.moc"
4

1 回答 1

5

您看到的“期望”行为实际上是一个错误,我将为此提交错误报告。感谢您发现它 - 漂亮的角落案例。

您需要将按钮的大小策略设置为双向扩展。按钮通常不希望垂直扩展,因此如果您尝试切换对齐方式的变体,您会发现它只能水平工作,这是正确的。

这是一个简单的演示,显示了也满足您的需求的正确行为。

#include <QPushButton>
#include <QGridLayout>
#include <QApplication>

class AlignButton : public QPushButton {
    Q_OBJECT
    Qt::Alignment m_alignment;
    Q_SLOT void clicked()  {
        m_alignment ^= Qt::AlignCenter;
        parentWidget()->layout()->setAlignment(this, m_alignment);
        label();
    }
    void label() {
        setText(QString("Alignment = %1").arg(m_alignment));
    }
public:
    AlignButton(Qt::Alignment alignment, QWidget * parent = 0) :
        QPushButton(parent),
        m_alignment(alignment)
    {
        connect(this, SIGNAL(clicked()), SLOT(clicked()));
        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        label();
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    QGridLayout layout(&window);
    layout.addWidget(new AlignButton(0), 0, 0, 0);
    layout.addWidget(new AlignButton(Qt::AlignCenter), 1, 0, Qt::AlignCenter);
    window.setMinimumSize(500, 200);
    window.show();
    return app.exec();
}

#include "main.moc"
于 2014-01-27T08:04:21.487 回答