Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Реалист от Июль 29, 2018, 12:11



Название: Обработка клика по динамически созданной кнопке
Отправлено: Реалист от Июль 29, 2018, 12:11
Ошибки:
Код:
QObject::connect: No such slot MainWindow::runCounter(count) in ..\test\mainwindow.cpp:74
QObject::connect:  (receiver name: 'MainWindow')

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlTableModel>
#include <QHBoxLayout>
#include <QLabel>
#include <QFrame>
#include <QTimer>

#include "database.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow {

Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

public:
Ui::MainWindow *ui;

public:
bool buildCounters();

public slots:
void runCounter(QLabel *count);

};

#endif // MAINWINDOW_H

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {

ui->setupUi(this);

// Вывести счетчики
this->buildCounters();

}

MainWindow::~MainWindow() {
delete ui;
}

// Вывод счетчиков
bool MainWindow::buildCounters() {

DataBase *db = new DataBase();

db->getCounters();

// Задать выравнивание по вертикали
ui->output_layout->setAlignment(Qt::AlignTop);

while (db->query.next()) {

// Горизонтальный слой
QHBoxLayout *row = new QHBoxLayout;

// Название счетчика
QLabel *name = new QLabel(this);
name->setText(db->query.value(db->rec.indexOf("name")).toString());
row->addWidget(name);

// Время
QLabel *count = new QLabel(this);
count->setText(db->query.value(db->rec.indexOf("count")).toString());
row->addWidget(count);

// Кнопка
QPushButton *btn = new QPushButton(this);
btn->setText("Старт/Стоп");
row->addWidget(btn);

// Обработчик для кнопки "Старт/Стоп"
connect(btn, SIGNAL(clicked()), this, SLOT(runCounter(count)));

// Вывести слой
ui->output_layout->addLayout(row);

}

return true;

}

// Запускает счетчик
void MainWindow::runCounter(QLabel *count) {

qDebug() << "runCounter";

}

где косяк?


Название: Re: Обработка клика по динамически созданной кнопке
Отправлено: GraninDm от Июль 29, 2018, 12:41
Думаю нужно смотреть в сторону QSignalMapper
http://doc.qt.io/qt-5/qsignalmapper.html (http://doc.qt.io/qt-5/qsignalmapper.html)


Название: Re: Обработка клика по динамически созданной кнопке
Отправлено: RedDog от Июль 29, 2018, 17:15
Сделать слот MainWindow::runCounter() без параметров, а внутри ловить sender() и кастовать к QLabel

PS: вообще плохая практика передавать указатели через сигналы-слоты.


Название: Re: Обработка клика по динамически созданной кнопке
Отправлено: kambala от Июль 29, 2018, 23:24
Сделать слот MainWindow::runCounter() без параметров, а внутри ловить sender() и кастовать к QLabel
так сендер же кнопка


Название: Re: Обработка клика по динамически созданной кнопке
Отправлено: RedDog от Июль 30, 2018, 07:32
Сделать слот MainWindow::runCounter() без параметров, а внутри ловить sender() и кастовать к QLabel
так сендер же кнопка
Да просмотрел. Тогда кнопке установить юзерское св-во, по которому лейбл можно будет однозначно найти. Как вариант в хеш засунуть некий ИД и указатель на лейбл, ключ от хеша передавать в кнопку.
Решений задачи можно тыщи придумать.


Название: Re: Обработка клика по динамически созданной кнопке
Отправлено: __Heaven__ от Июль 30, 2018, 08:40
Можно count сделать членом класса и не потребуется тогда передавать его


Название: Re: Обработка клика по динамически созданной кнопке
Отправлено: kambala от Июль 30, 2018, 17:16
Можно count сделать членом класса и не потребуется тогда передавать его
там в цикле заполнение
Думаю нужно смотреть в сторону QSignalMapper
http://doc.qt.io/qt-5/qsignalmapper.html (http://doc.qt.io/qt-5/qsignalmapper.html)

нормальное решение уже давно написали :)


Название: Re: Обработка клика по динамически созданной кнопке
Отправлено: Реалист от Июль 31, 2018, 10:47
всем спасибо
решил вопрос таким образом:
Код:
connect(btn, &QPushButton::clicked, [this,my_vars](){
  MainWindow::runCounter(my_vars);
});

не уверен как оно будет дальше, но пока с одной динамически созданной кнопкой работает