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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с функцией класса MainWindow, вызванной из другого  (Прочитано 1972 раз)
ogogon
Новичок

Offline Offline

Сообщений: 9



Просмотр профиля
« : Октябрь 09, 2021, 15:39 »

Коллеги, подскажите, пожалуйста, в чем моя проблема. Полагаю, что она элементарна, но я всю жизнь писал на кернигановском C и в C++ пока еще не чувствую себя уверенно.

Ситуация такая - у меня есть публичная функция в классе MainWindow, она читает из SQLite записи, и одно их поле докидывает в расположенный в главном окне combobox, как айтемы. Перед этим очищает его от старых.
Комбобокс адресуется как
Код:
ui->comboBoxMy
. В нем задействованы методы count(), removeItem(), addItem(). (Очистка поштучно делается, чтобы сохранить самый первый, по номеру нулевой, айтем - он там постоянный житель и должен быть всегда.)

Теперь проблема - когда я вызываю функцию из ее же класса MainWindow, все работает просто расчудесно, все что надо убирается, все что надо - добавляется. Комбобокс показывает текущее состояние таблицы в SQlite. Но если я вызываю функцию из других классов, то работа с СУБД идет нормально, (считанное дублируется в qDebug), а вот содержимое комбобокса не изменяется.
Функцию я вызываю так:
Код:
MainWindow mw;
mw.myFunc();

Подскажите, пожалуйста, что я делаю не так?

Ogogon.
Записан

Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.
tux
Крякер
****
Online Online

Сообщений: 399



Просмотр профиля
« Ответ #1 : Октябрь 09, 2021, 15:48 »

Вам нужно не создать ещё один экземпляр вашего MainWindow, а найти его в приложении. А затем уже вызывать myFunc.
Или передать в те классы, которые эту функцию будут использовать, указатель на MainWindow.
Записан

ogogon
Новичок

Offline Offline

Сообщений: 9



Просмотр профиля
« Ответ #2 : Октябрь 10, 2021, 00:05 »

Вам нужно не создать ещё один экземпляр вашего MainWindow, а найти его в приложении. А затем уже вызывать myFunc.
Или передать в те классы, которые эту функцию будут использовать, указатель на MainWindow.
Благодарю. К сожалению, я не совсем понял, как это нужно делать практически. Мой опыт борьбы с C++ пока не велик.
Как мне "найти MainWindow" из другого класса? Как в класс, который реализует окно, запускаемое по сигналу интерфейса через приватный слот, передать указатель на MainWindow?

Полагаю, что вызов публичной функции из другого класса - достаточно типовая необходимость. Наверное, для этого в C++ есть какие-то корректные механизмы?

Ogogon.
Записан

Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.
ogogon
Новичок

Offline Offline

Сообщений: 9



Просмотр профиля
« Ответ #3 : Октябрь 10, 2021, 07:59 »

Вам нужно не создать ещё один экземпляр вашего MainWindow, а найти его в приложении. А затем уже вызывать myFunc.
Я сделал следующим образом и у меня заработало.

В файл main.cpp я включил указатель на класс MainWindow:
Код:
Mainwindow *mw;

В файл заголовков main.h добавил информацию о нем:
Код:
extern Mainwindow *mw;

В конструкторе класса MainWindow в файле mainmindow,cpp начал заносить туда указатель:
Код:
mw = this;

Далее, вызвал из другого класса:
Код:
mw->myFunc();

Подскажите, пожалуйста, корректно ли такое решение?

Ogogon,
Записан

Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 10, 2021, 08:12 »

Наверное, для этого в C++ есть какие-то корректные механизмы?
Плюсы ничего не навязывают, можно просто использовать глобальную переменную
Код:
// mainwindow.cpp
MainWindow * theMainWin = nullptr;
и установить этот указатель при создании MainWindow
Тогда из др окна
Код:
// win1.cpp
extern MainWindow * theMainWin;
...
if (theMainWin)
 theMainWin->DoSomething();
Если же делать "в духе плюсов/OOП", то так
Код
C++ (Qt)
// MainWindow.h
class MainWindow {
..
public
 static MainWindow * Instance( void ) { return m_instance; }
private:
static MainWindow * m_instance;
};
И обеспечить корректность m_instance в конструкторе/деструкторе
Код
C++ (Qt)
// MainWindow.cpp
MainWindow * MainWindow::m_instance = nullptr;
 
MainWindow::MainWindow(.. )
{
 Q_ASSERT(m_instance == nullptr);
 m_instance = this;
 ...
}
 
MainWindow::~MainWindow( void )
{
 Q_ASSERT(m_instance == this);
 m_instance = nullptr;
 ...
}
Тогда использование
Код
C++ (Qt)
// win1.cpp
#include "MainWindow.h"
...
auto * inst = MainWindow::Instance();
if (inst)
inst->DoSomething();
 

Да, увидел Ваш последний пост, но не стал ничего менять, так даже лучше  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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