2015-10-30 4 views
0

У меня есть одна проблема, которую я не могу решить с помощью Интернета. У меня есть ярлык, и я устанавливаю pixmap на нем. Я положил его в главное окно (виджет), где тоже кнопка (QPushButton). Я хочу, чтобы сделать это:Непрерывно рисовать объект с помощью Qt и C++

  1. Если я нажимаю на кнопку, то на этой пиксельной будут нарисованы круги непрерывно
  2. Если я нажимаю эту кнопку для второго, то рисунок должен быть остановлен функцией pause()

Второй легко, это пустой слот:

void pause() {} 

Но сначала я попытался использовать петлю

while(true) 
    draw(); 

но он разбил программу (цикл).

Любая идея, как ее решить?

ответ

2

Затем вы должны позвонить draw() с некоторым интервалом времени, вместо того чтобы остановить его весь поток графического интерфейса.

Для этого есть QTimer:

QTimer timer; // should be a member, a pointer optionally - you then do new Qtimer(this); 
connect(&timer, &QTimer::timeout, draw); 
timer.start(500); // in milliseconds 
// assuming you are calling this from member function of QObject-deriving class 
// and draw is a non-member function 

Если вы знаете, чтобы сделать это соединение, вы можете подключить его к чему-либо ...

То же самое можно сделать с QThread и положить его спать в этом цикле.

Anyhow, я не понимаю, как пустой pause() останавливает рисунок. Вы не останавливаете свое приложение еще раз? Просто сделайте timer.stop();.

+0

Вам не хватает '&' перед таймером. «Я не понимаю, как пустая пауза() останавливает рисунок» - он думает, что это выведет его из 'while (true)' как своего рода goto :) – dtech

+0

Спасибо, что заметили это. – LogicStuff

3

Вы не должны блокировать основной поток. Это заставит ОС учитывать, что ваше приложение повешено. Фактически, хорошей практикой является перемещение любого кода, выполнение которого занимает более 50 миллисекунд в другой поток, чтобы поддерживать основной поток, особенно в случае Qt, где он также является потоком графического интерфейса пользователя.

Вы должны использовать подход, управляемый событиями, который не будет блокировать поток.

class YourClass : public QObject { // QObject or derived 
    Q_OBJECT 
public: 
    YourClass() { connect(&timer, &Timer::timeout, this, &YourClass::draw); } 
public slots: 
    void start() { timer.start(33); } 
    void pause() { timer.stop(); } 
private: 
    QTimer timer; 
    void draw() { ... } 
}; 

Когда start() вызывается, draw() будет называться каждые 33 милисекунд. pause() будет эффективно останавливать это, пока не будет вызван start(). Вы можете контролировать скорость, с которой вызывается draw(), отрегулировав интервал таймера, по умолчанию это 0, что в случае чрезмерного перебора чертежа вы должны отрегулировать для требуемых кадров в секунду. В приведенном выше примере это равно 33 миллисекундам или примерно 30 FPS.