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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обращение к виджету из другого класса  (Прочитано 1295 раз)
Ody
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« : Февраль 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() срабатывает
« Последнее редактирование: Февраль 10, 2020, 15:19 от Ody » Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #1 : Февраль 10, 2020, 15:27 »

Если коротко, то читайте о системе  сигналов и слотов

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

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #2 : Февраль 10, 2020, 15:30 »

Да я то читал про сигнал и слоты и использую. только не могу понять как их реализовать в данном случае
Записан
Ody
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #3 : Февраль 10, 2020, 15:35 »

Подскажите новичку, а то весь мозг сломал!
Записан
Ody
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #4 : Февраль 10, 2020, 15:47 »

Да я то читал про сигнал и слоты и использую. только не могу понять как их реализовать в данном случае


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

Сообщений: 122


Просмотр профиля
« Ответ #5 : Февраль 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 созданный вами ранее.
Записан
Ody
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #6 : Февраль 10, 2020, 18:34 »

не сработало. может что-то не так сделал?!

void MainWindow::on_pushButton_clicked()
{
    Test t;
    connect(&t, &Test::isDone, this, &MainWindow::set_tw_check_file_insert_row);
}
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #7 : Февраль 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 - подвиснет приложение.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 515


Просмотр профиля
« Ответ #8 : Февраль 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.
Записан
Ody
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #9 : Февраль 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 и с файл там разбирают и мучают.


« Последнее редактирование: Февраль 11, 2020, 07:06 от Ody » Записан
Ody
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #10 : Февраль 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.
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #11 : Февраль 11, 2020, 13:54 »

Выбрасыват ошибку ASSERT: "c->sender == q_ptr" in file kernel\qobject.cpp, line 391
Там случаем не connect(&t, ...) остался?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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