Bor*_*eet 1 qt qwidget qpushbutton qlayout
我需要一个按钮来填充或不填充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"
Run Code Online (Sandbox Code Playgroud)
您看到的“期望”行为实际上是一个错误,我将为其提交错误报告。感谢您发现它 - 漂亮的角落案例。
您需要将按钮的大小策略设置为双向扩展。按钮通常不想垂直扩展,因此如果您尝试切换对齐方式的变体,您会看到它只能在水平方向上工作,这是正确的。
这是一个简单的演示,展示了也满足您需求的正确行为。
#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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6192 次 |
| 最近记录: |