У меня вопрос как переопределить сигнал в Qt?
Я переопределил QCheckBox()
и изменил сигнал stateChanged
.
Проект собирается и работает. При этом не выводит в "выводе приложения" ошибок либо сообщений типа "сигнал с слотом не связался"
НО не связывает с слотом. Не могу понять что не так.
Вот так работает :
connect(test_checkbox[i], SIGNAL(stateChanged(int)), two_cl , SLOT(run_NEW()));// от кого, "реакция", кому, "выполнение"
Хочу доработать, чтобы еще строку, сигнал оправлял :
connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString))); // от кого, "реакция", кому, "выполнение"
переопределение QCheckBox-а
.h
#ifndef MYDIMASCHECKBOX_H
#define MYDIMASCHECKBOX_H
#include <QCheckBox>
class MyDimasCheckBox : public QCheckBox
{
Q_OBJECT
public:
MyDimasCheckBox(QWidget *parent =0);
~MyDimasCheckBox();
QString stroka;
signals:
void stateChanged(int, QString);
};
#endif // MYDIMASCHECKBOX_H
.cpp
#include "mydimascheckbox.h"
MyDimasCheckBox::MyDimasCheckBox(QWidget *parent)
{
stroka = "dimasik :3";
emit stateChanged(int(), stroka);
}
MyDimasCheckBox::~MyDimasCheckBox()
{
}
А вот где вызываю
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QCheckBox>
#include <QHBoxLayout>
#include <QDebug>
#include <QThread>
#include <QCoreApplication>
#include <iostream>
#include <vector>
#include "mydimascheckbox.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
int glob_i ;
int glob_flow;
int vector_schet; // датчик счёта
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void start_sending(bool); // принажатии на чекбокс то выполниться этот слот (отправка сообщений)
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QThread *thread = new QThread();
QVector<QThread*> vector_thread;
QList<MyDimasCheckBox*> test_checkbox; // 16/08
MyDimasCheckBox *checkBox = new MyDimasCheckBox(); // объявляем и инициализируем чекбокс через новый класс
// Создаём виджет, который будет содержать в себе чекбокс
QWidget *checkBoxWidget = new QWidget();
// создаём слой с привязкой к виджету
QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget);
};
class NewsThread: public QThread
{
Q_OBJECT
public slots:
void run_NEW(); // код выполняемый в потоке
void run_NEW(int, QString); // код выполняемый в потоке
signals:
void otprawka (int);
};
#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
glob_i=0;
glob_flow =0;
vector_schet =0;
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
test_checkbox.clear();
}
void MainWindow::on_pushButton_clicked()
{
glob_i++;
//-- добавляем чек бокс в таблицу
checkBoxWidget = new QWidget(); // создаём новый qwidget()
checkBox = new MyDimasCheckBox(); // объявляем и инициализируем чекбокс
layoutCheckBox = new QHBoxLayout(checkBoxWidget); // создаём слой с привязкой к виджету
test_checkbox.append(checkBox);
connect(checkBox, SIGNAL(toggled(bool)),this, SLOT(start_sending(bool))); // соединение всех чекетов с "действием" start_sending
checkBox->setText(QString::number(glob_i));
layoutCheckBox->addWidget(checkBox); // Устанавливаем чекбокс в слой
layoutCheckBox->setAlignment(Qt::AlignCenter); // Отцентровываем чекбокс
layoutCheckBox->setContentsMargins(0,0,0,0); // Устанавливаем нулевые отступы
ui->tW_test->insertRow(ui->tW_test->rowCount());//вводим колич строк (возвращ колич строк)
ui->tW_test->setCellWidget(ui->tW_test->rowCount()-1, 1, checkBoxWidget); // добавляем элемент в таблицу (строка, столбец, добавляемый элемент)
qDebug() << "glob_i: " << glob_i;
}
void MainWindow::start_sending(bool Value)
{
qDebug() << "start_sending " ;
// когда нажата отрабатывает, отжата то не отрабатывает
if (Value == true)
{
NewsThread *two_cl = new NewsThread(); // инициализируем второй класс
qDebug() << "chekbocks: "<< " TRUE" ;
for (int i =0;i < test_checkbox.length();i++ )
{
if(test_checkbox[i]->isChecked() ==Value)
{
glob_flow++;
// connect(test_checkbox[i], SIGNAL(stateChanged(int)), two_cl , SLOT(run_NEW()));// от кого, "реакция", кому, "выполнение"
connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString))); // от кого, "реакция", кому, "выполнение"
thread = new QThread(); // инициализ класс потока из за того что
vector_thread.append(thread);
vector_schet++;
qDebug() << "vector_schet : " << vector_schet ;
two_cl->moveToThread(vector_thread[vector_schet-1]); // отправляем в поток
vector_thread[vector_schet-1]->start(); // цикл обработки сообщения в потоке (второй поток)
}
}
}
else {
qDebug() << "chekbocks:" << " False";
glob_flow--;
qDebug() << "vector_schet : " << vector_schet ;
vector_thread[vector_schet-1]->exit();
}
}
void NewsThread::run_NEW()
{
qDebug() << "run_NEW()";
for(;;){ // вечный цикл
for (int i=0; i<500; i++){
qDebug()<< "Число :" << i <<"номер \"потока\" :" ;
usleep(100000);
}
}
}
void NewsThread::run_NEW(int i, QString str){
qDebug() << "run_NEW(int i, QString str) ";
for(;;){ // вечный цикл
for (int i=0; i<500; i++){
qDebug() << " i : " << i;
qDebug() << " str : " << str;
qDebug()<< "Число :" << i <<"номер \"потока\" :" ;
usleep(100000);
}
}
}
Ответ находиться по ссылке
Но так как я приверженец своей культуры я его выложу здесь переведенный ответ.(еще там мои поправки удалили и теперь он более тяжёл для понимания)
Перегрузить сигнал не получиться но можно направить сигнал на слот в котором будет лежать иной сигнал от другого коннекта к другому слоту. Для этого потребуется добавить в код один коннект.
В классе переопределения QCheckBox-а .h
class MyDimasCheckBox : public QCheckBox
{
Q_OBJECT
public:
MyDimasCheckBox(QWidget *parent =0);
~MyDimasCheckBox();
QString stroka;
private slots:
// Создаём новый сигнал
void doEmitStateChanged(int i);
signals:
void stateChanged(int, QString);
};
.cpp
#include "mydimascheckbox.h"
MyDimasCheckBox::MyDimasCheckBox(QWidget *parent) : QCheckBox(parent) {
// Connect original signal to slot
connect(this, SIGNAL(stateChanged(int)), this, SLOT(doEmitStateChanged(int)));
}
MyDimasCheckBox::~MyDimasCheckBox()
{
}
void MyDimasCheckBox::doEmitStateChanged(int i) {
stroka = "dimasik :3";
emit stateChanged(i, stroka);
}
А там где вызываю, заменяю код с:
// connect(test_checkbox[i], SIGNAL(stateChanged(int)), two_cl , SLOT(run_NEW()));// от кого, "реакция", кому, "выполнение"
connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString))); // от кого, "реакция", кому, "выполнение"
на:
connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString)));
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Когда запускаешь просто exe, все работаетКогда запускаешь службу, пишет только первую часть, цикл while (!pRstAuthors->EndOfFile) не выполняется
Пытаюсь подключиться к mariadb через jbdc отсюда: https://mariadbcom/kb/en/library/about-mariadb-connector-j/
Пытался через HtmlfromHtml, но не получается