2015-09-17 21 views
0

我有一些非常简单的代码,显示一个QPushButton,点击后用一个随机数1 - 100更新一个旋转盒。问题是我可以快速连续多次点击该按钮,只能看到一个或两个更新纺纱器。Qt:强制重画来更新快速按钮点击的文本?

如何重新绘制每次点击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); 
} 
+2

如何更新spinbox?通过信号/插槽还是通过setValue?一些快速代码会有所帮助。 – Bruce

+0

你有没有检查你是否错过了双击事件导致的点击事件? – Pete

+1

对于测试用例,只需包含整个模块:'#include '。对于产品代码,“”形式是错误的。你应该直接使用''。 –

回答

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); 
}