Russian Qt Forum
Ноябрь 22, 2024, 22:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка клика по динамически созданной кнопке  (Прочитано 5001 раз)
Реалист
Гость
« : Июль 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";

}

где косяк?
Записан
GraninDm
Гость
« Ответ #1 : Июль 29, 2018, 12:41 »

Думаю нужно смотреть в сторону QSignalMapper
http://doc.qt.io/qt-5/qsignalmapper.html
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #2 : Июль 29, 2018, 17:15 »

Сделать слот MainWindow::runCounter() без параметров, а внутри ловить sender() и кастовать к QLabel

PS: вообще плохая практика передавать указатели через сигналы-слоты.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июль 29, 2018, 23:24 »

Сделать слот MainWindow::runCounter() без параметров, а внутри ловить sender() и кастовать к QLabel
так сендер же кнопка
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #4 : Июль 30, 2018, 07:32 »

Сделать слот MainWindow::runCounter() без параметров, а внутри ловить sender() и кастовать к QLabel
так сендер же кнопка
Да просмотрел. Тогда кнопке установить юзерское св-во, по которому лейбл можно будет однозначно найти. Как вариант в хеш засунуть некий ИД и указатель на лейбл, ключ от хеша передавать в кнопку.
Решений задачи можно тыщи придумать.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Июль 30, 2018, 08:40 »

Можно count сделать членом класса и не потребуется тогда передавать его
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Июль 30, 2018, 17:16 »

Можно count сделать членом класса и не потребуется тогда передавать его
там в цикле заполнение
Думаю нужно смотреть в сторону QSignalMapper
http://doc.qt.io/qt-5/qsignalmapper.html

нормальное решение уже давно написали Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Реалист
Гость
« Ответ #7 : Июль 31, 2018, 10:47 »

всем спасибо
решил вопрос таким образом:
Код:
connect(btn, &QPushButton::clicked, [this,my_vars](){
  MainWindow::runCounter(my_vars);
});

не уверен как оно будет дальше, но пока с одной динамически созданной кнопкой работает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 23.