Qt:强制重绘以从快速按钮点击更新文本?

时间:2015-09-17 11:06:26

标签: c++ qt qwidget qt-signals

我有一些非常简单的代码,显示一个QPushButton,当点击它时,用随机数1 - 100更新一个旋转框。问题是我可以快速连续多次点击该按钮,只看到一个或两个更新旋转盒。

如何在QPushButton上每次点击重新绘制旋转框?我已经确认我正在触发并捕获多个点击信号,但是Qt并没有重新绘制大部分信号。

到目前为止,我已尝试在所有父窗口小部件,sendPostedEvents()和processEvents()上调用repaint(),repaint()。

#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QLayout>

#include <random>
#include <ctime>

class QtBtnEx : public QWidget
{
    Q_OBJECT

public:
    QtBtnEx(QWidget *parent = 0);

    QPushButton* btn;
    QSpinBox* spin;

public slots:
    void onClicked();
};


QtBtnEx::QtBtnEx(QWidget *parent)
    : QWidget(parent)
{

    btn = new QPushButton("button");
    spin = new QSpinBox();

    btn->setFixedSize(90, 30);
    spin->setFixedSize(90, 30);

    this->setLayout(new QVBoxLayout());
    this->layout()->setAlignment(Qt::AlignCenter);
    this->layout()->addWidget(btn);
    this->layout()->addWidget(spin);


    connect(btn, &QPushButton::clicked, this, &QtBtnEx::onClicked);
}

//Fires for every button click but does not paint for every click
void QtBtnEx::onClicked()
{
    srand(time(nullptr));
    spin->setValue(rand() % 100);
}

1 个答案:

答案 0 :(得分:1)

发现我的问题;我在插槽代码中调用了srand(time(nullptr))。它是我所看到的延误的原因。将它拉到顶部,旋转盒立即刷新。

#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QLayout>

#include <random>
#include <ctime>

class QtBtnEx : public QWidget
{
    Q_OBJECT

public:
    QtBtnEx(QWidget *parent = 0);

    QPushButton* btn;
    QSpinBox* spin;

public slots:
    void onClicked();
};


QtBtnEx::QtBtnEx(QWidget *parent)
    : QWidget(parent)
{
    srand(time(nullptr));

    btn = new QPushButton("button");
    spin = new QSpinBox();

    btn->setFixedSize(90, 30);
    spin->setFixedSize(90, 30);

    this->setLayout(new QVBoxLayout());
    this->layout()->setAlignment(Qt::AlignCenter);
    this->layout()->addWidget(btn);
    this->layout()->addWidget(spin);


    connect(btn, &QPushButton::clicked, this, &QtBtnEx::onClicked);
}

void QtBtnEx::onClicked()
{
    spin->setValue(rand() % 100);
}