подключение основного сигнала mousepress

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

   connect(ui->plot, SIGNAL(mousePress(QMouseEvent *event)), this,  SLOT(mousedrag(QMouseEvent*))); 

и я продолжаю получать:

QObject::connect: Нет такого сигнала QCustomPlot::mousePress(QMouseEvent *event)

Но mouseWheel(QWheelEvent*), а также mouseWheel и mousePress имеют сигналы, объявленные в библиотеке QCustomPlot.

Где я ошибаюсь? Кроме того, если у кого-то есть лучший сигнал для запуска моей функции mousedrag(QMouseEvent*), которая изменяет масштаб оси y2 в соответствии с осью y1, я открыт для предложений.


person Georges    schedule 03.06.2016    source источник


Ответы (2)


Подпись сигнала, переданная connect, недействительна. Имена параметров не являются частью подписи. Вы также должны удалить все пробелы, чтобы connect не приходилось нормализовать подписи. В нормализованной подписи нет ненужных пробелов, а самая внешняя const и ссылка должны быть удалены, например. SIGNAL(textChanged(QString)), не SIGNAL(textChanged(const QString &)).

                                                 remove
                                                 vvvvv
connect(ui->plot, SIGNAL(mousePress(QMouseEvent *event)), this,             
        SLOT(mousedrag(QMouseEvent*)));

Вместо этого выполните следующее:

// Qt 5
connect(ui->plot, &QCustomPlot::mousePress, this, &MyClass::mousedrag);
// Qt 4
connect(ui->plot, SIGNAL(mousePress(QMouseEvent*)), SLOT(mousedrag(QMouseEvent*));

Боковая панель

Вкратце: такой дизайн API по сути является ошибкой.

События и механизм сигналов/слотов — это разные парадигмы, которые дизайн QCustomPlot совмещает воедино. Слоты, подключенные к этим сигналам, могут использоваться только очень специфическими и ограниченными способами. Вы должны использовать их точно так же, как если бы они были перегрузками в производном классе. Это означает:

  1. К каждому сигналу должен быть подключен либо 0, либо 1 слот.

  2. Соединения должны быть прямыми или автоматическими с объектом в том же потоке.

    Вы не можете использовать соединения в очереди: к тому времени, когда элемент управления вернется в цикл событий, событие будет уничтожено, и слот/функтор будет использовать висячий указатель.

person Kuba hasn't forgotten Monica    schedule 03.06.2016
comment
спасибо за вашу помощь, я попытался удалить событие, но в конце проблема была с пробелами. Есть ли что-то, что я мог бы использовать лучше, чем нажатие мыши в качестве сигнала, потому что я хочу, чтобы он активировался только тогда, когда пользователь перетаскивает - person Georges; 03.06.2016
comment
@Georges Проблема не могла быть связана с пробелами, поскольку они нормализованы (за счет времени выполнения), и ваш код не будет работать с присутствующим идентификатором (event). Вероятно, вам следует провести небольшой тест, чтобы убедиться, что это так, — не просто доверяйте мне, заставьте себя увидеть это. Если вы используете Qt 5, вам все равно не следует использовать старый синтаксис connect, тогда он будет проверен для вас во время компиляции. - person Kuba hasn't forgotten Monica; 04.06.2016

При использовании «старого» синтаксиса соединения сигналов/слотов, т. е. того, который использует макросы SIGNAL и SLOT в операторе connect(), вы не должны указывать имена параметров, только их типы.

Другими словами:

SIGNAL(mousePress(QMouseEvent *event)) // WRONG, parameter name in there!
SIGNAL(mousePress(QMouseEvent *)) // GOOD
SIGNAL(mousePress(QMouseEvent*)) // BETTER: already normalized

Поэтому просто измените свое утверждение на

connect( ui->plot, SIGNAL(mousePress(QMouseEvent*)), 
         this,     SLOT(mousedrag(QMouseEvent*)) ); 
person peppe    schedule 03.06.2016