Qt制作QPushButton填充布局单元

Qt制作QPushButton填充布局单元,qt,qwidget,qpushbutton,qlayout,Qt,Qwidget,Qpushbutton,Qlayout,创建按钮时,我需要一个按钮来填充或不填充QGridLayout单元格提供的整个空间(对齐值从文件加载)。我用下面的代码简化了我的情况。在运行时,用户可以设置按钮的对齐方式-使其填充整个布局单元或精确居中。只要按钮没有以指定的空对齐开始,它就可以工作。但是,我需要能够以空对齐开始(即按钮填充布局单元的空间)。当最初与NULL对齐时,设置了什么使按钮锁定到AlignVCenter设置中?如何使按钮返回到与NULL对齐不同的初始状态 我在Ubuntu 12.04 LTS上使用Qt4.8 #includ

创建按钮时,我需要一个按钮来填充或不填充
QGridLayout
单元格提供的整个空间(对齐值从文件加载)。我用下面的代码简化了我的情况。在运行时,用户可以设置按钮的对齐方式-使其填充整个布局单元或精确居中。只要按钮没有以指定的空对齐开始,它就可以工作。但是,我需要能够以空对齐开始(即按钮填充布局单元的空间)。当最初与NULL对齐时,设置了什么使按钮锁定到AlignVCenter设置中?如何使按钮返回到与NULL对齐不同的初始状态

我在Ubuntu 12.04 LTS上使用Qt4.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"
#包括
#包括
#包括
#包括
类MyWidget:publicqwidget{
Q_对象
QPushButton*m_pb;
QGridLayout*m_gl;
受保护插槽:
void();
公众:
MyWidget(QWidget*parent=0);
};
MyWidget::MyWidget(QWidget*parent):QWidget(parent)
{
m_pb=新的QPushButton(tr(“推我”);
连接(m_pb,信号(点击()),此,插槽(点击());
m_gl=新的QGridLayout();
//按下按钮时,使用(1)查看按钮展开
//使用(2)表示我无法开始
/*1*///m_gl->addWidget(m_pb,0,0,Qt::AlignCenter);//创建所需的效果
/*2*///m_gl->addWidget(m_pb,0,0,0);//未创建所需效果
设置布局(m_gl);
}
void MyWidget::pbClicked(){
//只要初始对齐不为空,将展开按钮
m_gl->setAlignment(m_pb,0);
}
int main(int argc,char*argv[]){
QApplication应用程序(argc、argv);
MyWidget*widget=newmywidget();
qmain窗口;
setCentralWidget(小部件);
window.show();
返回app.exec();
}
#包括“main.moc”
您看到的“期望”行为实际上是一个错误,我将为此提交一份错误报告。谢谢你发现它-漂亮的角落案例

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

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

#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 = new QGridLayout(&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"
#包括
#包括
#包括
类对齐按钮:公共QPushButton{
Q_对象
Qt::对齐m_对齐;
Q_槽空单击(){
m_alignment^=Qt::AlignCenter;
parentWidget()->layout()->setAlignment(这是m_对齐);
标签();
}
无效标签(){
setText(QString(“对齐=%1”).arg(m_对齐));
}
公众:
AlignButton(Qt::Alignment,QWidget*parent=0):
QPushButton(父级),
m_校准(校准)
{
连接(此,信号(单击()),插槽(单击());
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
标签();
}
};
int main(int argc,char*argv[]){
QApplication应用程序(argc、argv);
QWidget窗口;
QGridLayout*布局=新的QGridLayout(&窗口);
布局->添加小部件(新对齐按钮(0),0,0,0);
布局->添加小部件(新建AlignButton(Qt::AlignCenter),1,0,Qt::AlignCenter);
窗口设置最小尺寸(500200);
window.show();
返回app.exec();
}
#包括“main.moc”
您看到的“期望”行为实际上是一个错误,我将为此提交一份错误报告。谢谢你发现它-漂亮的角落案例

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

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

#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 = new QGridLayout(&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"
#包括
#包括
#包括
类对齐按钮:公共QPushButton{
Q_对象
Qt::对齐m_对齐;
Q_槽空单击(){
m_alignment^=Qt::AlignCenter;
parentWidget()->layout()->setAlignment(这是m_对齐);
标签();
}
无效标签(){
setText(QString(“对齐=%1”).arg(m_对齐));
}
公众:
AlignButton(Qt::Alignment,QWidget*parent=0):
QPushButton(父级),
m_校准(校准)
{
连接(此,信号(单击()),插槽(单击());
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
标签();
}
};
int main(int argc,char*argv[]){
QApplication应用程序(argc、argv);
QWidget窗口;
QGridLayout*布局=新的QGridLayout(&窗口);
布局->添加小部件(新对齐按钮(0),0,0,0);
布局->添加小部件(新建AlignButton(Qt::AlignCenter),1,0,Qt::AlignCenter);
窗口设置最小尺寸(500200);
window.show();
返回app.exec();
}
#包括“main.moc”