LINUX.ORG.RU

Сигналы и слоты - проблема [РЕШЕНО]

 , , ,


0

1

Есть форма, на которой есть Label. Нужно обновлять его раз в секунду (выводить время).

Есть функция setTime, которая получает время от другой функции и выводит на форму:

void setTime(Ui::panel* ui, bool showSeconds) {
    QString currentTime = clockApplet::getCurrentTime(showSeconds);
    ui->timeLabel->setText(currentTime);
}

Нужно делать это раз в секунду, поэтому использую QTimer.

void setRepeatingActions(Ui::panel* ui, panel* w) {
    QTimer* timeSetTimer = new QTimer();
    timeSetTimer->setInterval(1000);
    if (!config["showSeconds"].toBool()) {
        //!  w->connect(timeSetTimer, SIGNAL(timeout()), w, SLOT(setTime(ui,false)));
        //!  w->connect(timeSetTimer, &QTimer::timeout, w, setTime(ui,false));
    }
    else {

    }
    timeSetTimer->start();
}

Оба варианта под восклицательным знаком не работают. В первом случае все компилируется, но в консоль падает: No such slot panel::setTime(ui,false). Во втором случае ему в принципе аргументы функции connect() не нравятся, no matching member function for call to ‘connect’. Подскажите, пожалуйста, что сделать, чтобы исправить.



Последнее исправление: thm (всего исправлений: 2)

как минимум стоит убрать утечку памяти

new QTimer(this);

во-вторых я не уверен, что передача слоту параметров устанавливающей таймер функцией нормальная идея.

AKonia ★★★
()

А setTime объявлена как слот?

u-235
()

У тебя сигнал не содержит ни одного параметра, который твоя функция ожидает на вход. Самое простое решение — заведи отдельную функцию-слот вида void showTime(); и соединяй сигнал с ней. А в ней уже дёргай эту свою, передавая туда всё, что нужно

XMs ★★★★★
()

Чтобы выполнить произвольный код можно лямбду использовать:

w->connect(timeSetTimer, &QTimer::timeout, w, [this]() { setTime(ui,false); });
xaizek ★★★★★
()
Ответ на: комментарий от XMs

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

thm
() автор топика
Ответ на: комментарий от xaizek

error: variable ‘ui’ cannot be implicitly captured in a lambda with no capture-default specified

и кстати, параметр w как раз и есть this, который имелся ввиду (пришлось его передать, потому что никак не обратиться к нему)

thm
() автор топика
Ответ на: комментарий от rumgot

У меня есть файлы main.cpp, panel.cpp, panel.h. Весь основной код пишу в panel.cpp. Для того, чтобы иметь доступ к элементам формы, передаю указатель на ui и w func(Ui::panel* ui, panel* w).

thm
() автор топика
Последнее исправление: thm (всего исправлений: 2)
Ответ на: комментарий от rumgot

сейчас попробую. я заменил this на w, который передал туда.

thm
() автор топика
Ответ на: комментарий от thm

Тогда так, наверное:

w->connect(timeSetTimer, &QTimer::timeout, w, [ui]() { setTime(ui,false); });

Я пропустил, что ui это агрумент, а функции не часть класса, видимо.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

да, так все работает. спасибо.

thm
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.