QT:动态子按钮不可见

时间:2014-09-18 05:17:33

标签: c++ qt qt4

我有一个项目,我想在我单击表单时动态添加按钮。

这是我的标题:

namespace Ui {
class frmBedBook;
}

class frmBedBook : public QWidget
{
    Q_OBJECT

public:
    explicit frmBedBook(QWidget *parent = 0);
    void mousePressEvent(QMouseEvent *event);
    ~frmBedBook();

private:
    Ui::frmBedBook *ui;
    QSignalMapper *signalMapper;
    QList<QPushButton*> buttonList;
    QGridLayout *lyWidget;
    QWidget *m_widget;
public slots:
    void clicked(int buttonId);
};

这是我的实施:

frmBedBook::frmBedBook(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::frmBedBook)
{
    ui->setupUi(this);

    signalMapper = new QSignalMapper();

    QPushButton *p;

    lyWidget = new QGridLayout();

    m_widget = new QWidget();
    m_widget->setGeometry(0,0,930,472);

    lyWidget->setContentsMargins(0,0,0,0);
    lyWidget->addWidget(m_widget);
    setLayout(lyWidget);

    p = new QPushButton(m_widget);
    p->setText("00");
    p->setGeometry(0, 0, 50, 50);
    buttonList.append(p);
    connect(p, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(p,0);

    p = new QPushButton(m_widget);
    p->setText("01");
    p->setGeometry(50, 0, 50, 50);
    p->setObjectName("01");
    buttonList.append(p);
    connect(p, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(p,1);

    connect(signalMapper, SIGNAL(mapped(int)),this, SLOT(clicked(int)));
}

void frmBedBook::mousePressEvent(QMouseEvent *event)
{
    QPushButton *p;

    p = new QPushButton(m_widget);
    p->setText("02");
    p->setGeometry(QCursor::pos().x(), QCursor::pos().y(), 50, 50);
    buttonList.append(p);
    connect(p, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(p,2);
}

问题是按钮已创建,但不可见。我知道这是因为我已经通过m_widget的孩子进行了追踪并找到了它。我也已经在MousePressEvent函数中重置了布局,但什么也没发生。有谁可以帮我解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果在构建表单后添加按钮,则需要在按钮上调用show()。此外,QCursor::pos()可能无法提供您想要的职位。

您可以使用x()/y()的{​​{1}}功能代替:

QMouseEvent

请注意,除非您已经拥有void frmBedBook::mousePressEvent(QMouseEvent *event) { QPushButton *p; p = new QPushButton(m_widget); p->setText("02"); p->setGeometry(event->x(), event->y(), 50, 50); p->show(); buttonList.append(p); connect(p, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(p,2); } ,否则需要#include <QtGui/QMouseEvent>

答案 1 :(得分:1)

您永远不会显示按钮,因此它们会保持隐藏状态。使用QWidget::show()。这适用于在已显示之后在mousePressEvent中创建的小部件。构造函数中创建的按钮应在显示其父元素时自动显示。