Russian Qt Forum

Qt => Общие вопросы => Тема начата: Ody от Февраль 10, 2020, 15:17



Название: Обращение к виджету из другого класса
Отправлено: Ody от Февраль 10, 2020, 15:17
Постараюсь описать проблему:

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "test.h"
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
 
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void set_tw_check_file_insert_row();
 
 
private slots:
    void on_pushButton_clicked();
 
private:
    Ui::MainWindow *ui;
};
#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);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::set_tw_check_file_insert_row()
{
        ui->tableWidget->insertRow(ui->tableWidget->rowCount());
}

test.h
Код:
#ifndef TEST_H
#define TEST_H
 
 
class Test
{
public:
    Test();
    void calculate();
};
 
#endif // TEST_H

test.cpp
Код:
#include "test.h"
#include "mainwindow.h"
 
Test::Test()
{
 
}
 
void Test::calculate()
{
    MainWindow mw;
    mw.set_tw_check_file_insert_row();
}
Есть кнопка по нажатии которой вызывается метод Calculate, в котором условно происходит сложные вычисления. После вызывает метод

Код:
set_tw_check_file_insert_row();
который добавляет строку новую строку в TableWidget информацией и результатами.

Собственно вопрос такой, не создается строка и не проходит команда. Может кто-то подскажет что делаю не так!


Если в реализации


void MainWindow::set_tw_check_file_insert_row()
{
        ui->tableWidget->insertRow(ui->tableWidget->rowCount());
}
Ввести qDegug() << "ТЕст";

то qDebug() срабатывает


Название: Re: Обращение к виджету из другого класса
Отправлено: Apktyc от Февраль 10, 2020, 15:27
Если коротко, то читайте о системе  сигналов и слотов (https://doc.qt.io/qt-5/signalsandslots.html)

У вас в методе calculate создается объект класса MainWindow (не имеет отношения к вашему окну), для него выполняется метод set_tw_check_file_insert_row(), и объект сразу удаляется, при выходе за пределы видимости.


Название: Re: Обращение к виджету из другого класса
Отправлено: Ody от Февраль 10, 2020, 15:30
Да я то читал про сигнал и слоты и использую. только не могу понять как их реализовать в данном случае


Название: Re: Обращение к виджету из другого класса
Отправлено: Ody от Февраль 10, 2020, 15:35
Подскажите новичку, а то весь мозг сломал!


Название: Re: Обращение к виджету из другого класса
Отправлено: Ody от Февраль 10, 2020, 15:47
Да я то читал про сигнал и слоты и использую. только не могу понять как их реализовать в данном случае


Пробовал испустить сигнал с помощью emit тоже не выходит


Название: Re: Обращение к виджету из другого класса
Отправлено: Apktyc от Февраль 10, 2020, 15:49
В классе Test создать сигнал об окончании вычислений и посылать его в конце calculate
Код
C++ (Qt)
class Test : public QObject
{
Q_OBJECT
public:
Test();
void calculate()
{
/*
work hard
*/

emit calcDone();
}
signals:
void calcDone();
};
В MainWindow связываем все это дело
Код
C++ (Qt)
connect(TestObject, &Test:calcDone, this, &MainWindow::set_tw_check_file_insert_row);
Где TestObject указатель на объект класса Test созданный вами ранее.


Название: Re: Обращение к виджету из другого класса
Отправлено: Ody от Февраль 10, 2020, 18:34
не сработало. может что-то не так сделал?!

void MainWindow::on_pushButton_clicked()
{
    Test t;
    connect(&t, &Test::isDone, this, &MainWindow::set_tw_check_file_insert_row);
}


Название: Re: Обращение к виджету из другого класса
Отправлено: Apktyc от Февраль 10, 2020, 23:09
не сработало. может что-то не так сделал?!

void MainWindow::on_pushButton_clicked()
{
    Test t;
    connect(&t, &Test::isDone, this, &MainWindow::set_tw_check_file_insert_row);
}


При клике на кнопку (подозреваю связь установлена в редакторе форма), создается объект класса Test и соединяется сигнал Test::isDone с методом MainWindow::set_tw_check_file_insert_row.
И собственно сразу объект уничтожается. Нет вызова метода calculate, в конце исполнения которого, по идее, находится отсылка этого сигнала.

Вообще не понятно, чего именно вы пытаетесь добиться, классы MainWindow и Test никак не связаны между собой, можно без заморочки написать так
Код
C++ (Qt)
void MainWindow::on_pushButton_clicked()
{
 Test t;
 t.calculate();
 set_tw_check_file_insert_row();
}
 
Но все это выполняется в интерфейсном потоке, и в случае долгих вычислений в calculate - подвиснет приложение.


Название: Re: Обращение к виджету из другого класса
Отправлено: ssoft от Февраль 11, 2020, 04:45
не сработало. может что-то не так сделал?!

void MainWindow::on_pushButton_clicked()
{
    Test t;
    connect(&t, &Test::isDone, this, &MainWindow::set_tw_check_file_insert_row);
}


Конечно не так). Как минимум, здесь t уничтажается сразу после выхода из зоны видимости метода on_pushButton_clicked.


Название: Re: Обращение к виджету из другого класса
Отправлено: Ody от Февраль 11, 2020, 07:05
не сработало. может что-то не так сделал?!

void MainWindow::on_pushButton_clicked()
{
    Test t;
    connect(&t, &Test::isDone, this, &MainWindow::set_tw_check_file_insert_row);
}




При клике на кнопку (подозреваю связь установлена в редакторе форма), создается объект класса Test и соединяется сигнал Test::isDone с методом MainWindow::set_tw_check_file_insert_row.
И собственно сразу объект уничтожается. Нет вызова метода calculate, в конце исполнения которого, по идее, находится отсылка этого сигнала.

Вообще не понятно, чего именно вы пытаетесь добиться, классы MainWindow и Test никак не связаны между собой, можно без заморочки написать так
Код
C++ (Qt)
void MainWindow::on_pushButton_clicked()
{
 Test t;
 t.calculate();
 set_tw_check_file_insert_row();
}
 
Но все это выполняется в интерфейсном потоке, и в случае долгих вычислений в calculate - подвиснет приложение.




суть в том что в классе тест происходит работа с открываемым файлом, разбирается его содержимое.  Файл бинарный. И там в методе Calculate класса Test Проверка условия, если допустим 40 и 41 байт дают значение 4, то запускается цикл, который повторяется 4 раза. На каждой итерации записывается в переменные значение следующих байт. Сразу происходит проверка их на соответствие чему надо и после,  их надо независимо от результата передать для отображения в таблицу пользователю.

по этому такая странная реализация.

Переменные нужны в классе Test, на основе них идет дальше вычисление.

клик на кнопку это имитация того что после выбора файла в директории он как бы передается в Класс Test и с файл там разбирают и мучают.




Название: Re: Обращение к виджету из другого класса
Отправлено: Ody от Февраль 11, 2020, 07:11
не сработало. может что-то не так сделал?!

void MainWindow::on_pushButton_clicked()
{
    Test t;
    connect(&t, &Test::isDone, this, &MainWindow::set_tw_check_file_insert_row);
}



объявил переменную класса Test в Mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "test.h"


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    Test *t;


Выбрасыват ошибку ASSERT: "c->sender == q_ptr" in file kernel\qobject.cpp, line 391



Конечно не так). Как минимум, здесь t уничтажается сразу после выхода из зоны видимости метода on_pushButton_clicked.


Название: Re: Обращение к виджету из другого класса
Отправлено: Apktyc от Февраль 11, 2020, 13:54
Выбрасыват ошибку ASSERT: "c->sender == q_ptr" in file kernel\qobject.cpp, line 391
Там случаем не connect(&t, ...) остался?