Qt Qslider не гладкий

У меня есть qslider для управления масштабированием карты следующим образом:
connect (ui-> zoomSlider, SIGNAL (valueChanged (int)), ui-> map, SLOT (SetZoom (int)));
Тем не менее, потому что эта онлайн-карта реагирует относительно медленно.

Я обнаружил, что реакция qslider также становится очень медленной, что означает, что когда вы двигаете ползунок, его положение не изменится, пока он внезапно не перейдет в положение, в котором вы отпустите кнопку мыши.

Как я мог решить это?

3

Решение

Одно из возможных решений для задержки обработки вашего 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

Поставленный в очередь сигнал передается первым, но принимается последним. И это может быть использовано в вашем случае для определения приоритетности обработки излучаемых сигналов.

Однако более всего использование соединения с очередями не поможет вам, потому что пользователь слишком часто генерирует событие слайдера, и пользовательский интерфейс в любом случае зависнет. Итак, я могу предложить следующее:

  1. Определите, почему именно пользовательский интерфейс зависает, а какая часть кода его замораживает.
  2. Старайтесь избегать зависания при асинхронных вызовах или перемещении логики в отдельный поток, или используя QtConcurrent
  3. Если вы действительно не можете контролировать способ масштабирования карты на своей веб-странице, попробуйте игнорировать все события, сгенерированные QSlider, и реагировать только на последние, сгенерированные в 500 мс интервал, например.
0

Другие решения


По вопросам рекламы [email protected]