定时器在随机位置产生QPushButtons

时间:2016-06-04 18:14:38

标签: c++ qt

我想设置一个计时器,每30ms在窗口小部件的随机位置创建一个QPushButton。我有以下代码,但它不起作用(窗口标题更改,而没有QPushButton出现):

.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class Tbutton : public QWidget
{
    Q_OBJECT
public:
    Tbutton(QWidget * parent=0);
protected:

  void timerEvent(QTimerEvent *event);

};

#endif // MAINWINDOW_H

.cpp文件:

#include <QTimer>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
Tbutton::Tbutton(QWidget *parent) :QWidget(parent)
{

    startTimer(30);

}

void Tbutton::timerEvent(QTimerEvent *e)
{

    Q_UNUSED(e);
      QPushButton * b1=new QPushButton("re",this);
      b1->setGeometry(rand(),rand(),20,20);
      QString abs="abs"+QString::number(rand());
      setWindowTitle(abs);
}

2 个答案:

答案 0 :(得分:1)

rand()返回0RAND_MAX之间的整数,这通常是一个很大的值(在VC ++ CRT上它是32767,在glibc上它是2147483647);因此,几乎在每种情况下,您都会在窗口的右下方产生很远的按钮,根本不可见。

您可以通过将随机范围限制为包含窗口的大小来解决此问题:

QPushButton * b1=new QPushButton("re",this);
b1->setGeometry(
    rand() % std::max((this->width()-20), 1),
    rand() % std::max((this->height()-20), 1),
    20,20);

答案 1 :(得分:0)

答案是在b1->show()中添加timerEvent