У меня есть qslider для управления масштабированием карты следующим образом:
connect (ui-> zoomSlider, SIGNAL (valueChanged (int)), ui-> map, SLOT (SetZoom (int)));
Тем не менее, потому что эта онлайн-карта реагирует относительно медленно.
Я обнаружил, что реакция qslider также становится очень медленной, что означает, что когда вы двигаете ползунок, его положение не изменится, пока он внезапно не перейдет в положение, в котором вы отпустите кнопку мыши.
Как я мог решить это?
Одно из возможных решений для задержки обработки вашего signal
это соединить его со слотом, используя Qt :: QueuedConnection.
connect(ui->zoomSlider, SIGNAL(valueChanged(int)), ui->map, SLOT(SetZoom(int)), Qt::QueuedConnection);
С Qt::QueuedConnection
излученный valueChanged
событие сигнала не будет обработано во время генерации, как это происходит с directly
подключенные сигналы. Событие будет добавлено в очередь цикла событий. Вот как Qt::QueuedConnection
реализован внутри Qt.
Specially for Nejat
Для проверки этого подхода можно использовать следующий код:
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void signalReceived();
void signalReceivedQueued();
void buttonPressed();
signals:
void directConnectedSignal();
void queuedConnectedSignal();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this, SIGNAL(directConnectedSignal()), SLOT(signalReceived()), Qt::DirectConnection);
connect(this, SIGNAL(queuedConnectedSignal()), SLOT(signalReceivedQueued()), Qt::QueuedConnection);
connect(ui->pushButton, SIGNAL(pressed()), SLOT(buttonPressed()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::signalReceived()
{
qDebug() << "signalReceived";
}
void MainWindow::signalReceivedQueued()
{
qDebug() << "signalReceivedQueued";
}
void MainWindow::buttonPressed()
{
emit queuedConnectedSignal();
emit directConnectedSignal();
}
Если вы запустите фрагмент кода выше, вы получите следующий вывод при нажатии кнопки:
signalReceived
signalReceivedQueued
Поставленный в очередь сигнал передается первым, но принимается последним. И это может быть использовано в вашем случае для определения приоритетности обработки излучаемых сигналов.
Однако более всего использование соединения с очередями не поможет вам, потому что пользователь слишком часто генерирует событие слайдера, и пользовательский интерфейс в любом случае зависнет. Итак, я могу предложить следующее:
QtConcurrent
500
мс интервал, например.