Qt: Выполнение добавления из другого класса - PullRequest
0 голосов
/ 06 сентября 2011

Я довольно новичок в Qt и C ++ в целом, так что это может быть простой проблемой.

Текущая проблема:

Я хочу выполнить функцию, котораядобавляет текст в TextEditField, вызывая функцию из другого класса.Я могу вызвать функцию, и текст добавляется через тот же класс, но когда я пытаюсь вызвать его из другого класса, он просто не выполнит добавление и не выдаст ошибок.

Чтобы упростить его, я просто вызовумои классы A и B.

Class A // The class that was created automatically by Qt 
Class B // A class that i made myself

Класс A имеет функцию "logger", которая выглядит следующим образом:

void ClassA::logger()
{
    ui->Logg->append("A log message"); // Straight forward, it appends the text
}

Я могу позвонить ClassA :: logger из другой функции в классе A, и все прекрасно работает так:

void ClassA::MakeALogg()
{
    logger(); // The logger function appends the text to TextEditField Logg
}

НО, когда я пытаюсь выполнить функцию регистратора из другой функции, она не будет работать.Мой текущий код выглядит следующим образом: ClassB :

void ClassB::MakeALogg()
{
    ClassA A;
    A.logger(); // The text doesn't get appended to TextEditField Logg via external class
}

Это не будет работать при вызове функции logger () и без ошибок, где указано.

КонецВ результате мы должны включить эту функцию, чтобы QString передавался в функцию logger (), что я сейчас могу сделать очень сложно, если вызову его через тот же класс, например ClassA::MakeALogg() to ClassA::logger(QString LogMSG).Но сначала я хочу убедиться, что я могу получить доступ к функции ui-> из другого класса.

Моя теория

Ну, я думаю, что проблема заключается в некоторой формесоздания экземпляра мисс для класса для этого конкретного исключения (например, тип Ui).На этом этапе я могу вызвать функцию из класса A в класс B и получить возврат {for example ClassA::GiveNumber() to ClassB::NumberCalculator()}.Но когда дело касается интерфейса, он не может установить соединение по какой-то странной причине.

Я также пытался в заголовочном файле ClassB сделать ссылку на него, но это тоже не сработало:

class ClassA;

class ClassB
{
public:
ClassA * PointToClassA;
}

Void ClassB::Logger()
{
PointToClassA = new ClassA;
ClassA->logger();
}

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

В обоих ваших методах вы создаете новый объект ClassA, вы увидите проблему, если вы вызовете show для локальной переменной:

void ClassB::MakeALogg()
{
    ClassA A;
    A.show();
    A.logger(); 
}

Итак, вы должны вызывать метод logger для экземпляра класса, который уже существует, и для этого вам необходимо:

  • передать указатель ClassA всем классам, которые нуждаются в регистрации,
  • использовать статическую функцию ClassA или глобальную функцию для маршрутизации вызова к этому экземпляру (своего рода «шаблон Singleton»),
  • испускает сигнал в ClassB и подключает его к слоту в ClassA, который будет вести регистрацию (соединение сигнала / слота должно быть сделано в ClassA).

Если существует только 2 класса, как это, кажется, имеет место в соответствии с примером, который вы дали с "ClassB :: NumberCalculator", или если все экземпляры других классов являются потомками уникального экземпляра ClassA, третье решение, вероятно, лучшее.

0 голосов
/ 06 сентября 2011

Как и в вашем другом вопросе.Каждый раз, когда вы вызываете эту функцию, вы создаете совершенно новый экземпляр класса A. Функция фактически работает, но вы ничего не видите, потому что сразу после возврата из функции вы возвращаетесь из метода класса B, и локальный объект уничтожается.Вы должны предоставить B указатель или ссылку на реальный объект A, для которого вы хотите, чтобы эта функция вызывалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...