Передача QObject с указателем (Qt)

0

Моя цель - передать указатель windowobject в другой класс. Я покажу вам, что я получил до сих пор. где: "диалог" - это окно для прохождения.

mainwindow.cpp

dialog = new Dialog(this);
someClass(dialog);

Конструктор в некотором классе

 someClass::someClass(Dialog *d)
 {
 Dialog *dia = d;
 }

someClass.h

#include "dialog.h"
...
public:
someClass(Dialog *dialog)
//Dialog d;

Программа работает сейчас, но я не уверен, достигли ли я того, чего я хотел. Можно ли теперь взаимодействовать с моим диалогом? Я хочу что-то вроде этого.

 dia->ui->lineEdit->setText();

Любая помощь будет назначена

  • 0
    Теперь на ваши два вопроса у вас есть два ответа ...
Теги:
pointers
qt

3 ответа

0
Лучший ответ

Моя цель - передать указатель windowobject в другой класс. Я покажу вам, что я получил до сих пор. где: "диалог" - это окно для прохождения.

учитывая ваш код:

 someClass::someClass(Dialog *d)
 {
 Dialog *dia = d;
 }

является локальным членом в конструкторе someClass. Поэтому он имеет только область видимости в самом конструкторе (не видна вне конструктора и фактически не живет вне конструктора (уничтожается, когда конструктор выходит из области видимости)).

К счастью, dia - это указатель (адрес объекта), а не фактический диалог (поэтому только указатель, а не объект, на который он указывает, выходит за рамки). Если вы хотите, чтобы указатель оставался в области с целью доступа позже, вы должны "привязать" его к сфере действия класса (сделать его членом класса).

class MyClass 
{
  public:
     //Using reference as it may not be null...
     MyClass( Dialog& dialog );

     void showDialog();

  private:
    //We only want to expose a small part of dialog to users, 
    // hence keep it private, and expose what we want through
    // the interface (the public part).
    Dialog& dialog_;
};

//MyClass.cpp

MyClass::MyClass( QPointer<Dialog> )
: dialog_( dialog ) //Google "member initialisation"
{
}

void MyClass::showDialog(){ dialog_.show(); }

----- Изменено/Дополнительный ответ -----

Если в приведенном выше примере dialog_ является необязательным, то вам не нужно делать его ссылочным элементом, так как ссылочные члены требуют инициализации (у вас не может быть неинициализированной ссылки). В этом случае сделайте его указателем... При использовании Qt я сделаю его QPointer (Assuming Dialog - это QObject), поскольку QPointers более безопасны для работы, чем с необработанными указателями (они всегда инициализируются нулем, по крайней мере),

Я покажу вам основной принцип, чтобы сохранить его простым. Читайте о QPointers и умных указателях в целом.

например:

class MyClass 
{
  public:
     // May or may not hold zero...
     explicit MyClass( Dialog* dialog = 0 );

     void showDialog();

  private:
    //We only want to expose a small part of dialog to users, 
    // hence keep it private, and expose what we want through
    // the interface (the public part).
    Dialog* dialog_;
};

//.cpp
MyClass::MyClass( Dialog* dialog /* = 0*/ )
: dialog_( dialog )
{
}

void MyClass::showDialog() 
{
  if( dialog_ ) 
  {
    dialog_->show();
  }
  else
  {
    std::cout << "This is in fact not a dialog"
                 "\nbut be so kind as to enter"
                 " whatever you want here ;-)" 
              << std::endl;

    while( !terminated() )
    {
      std::string inputStr;
      std::cin >> inputStr;
      evalute( inputStr );
    }
  }
}
  • 0
    Ваш ответ очень помог здесь. Спасибо. Кажется, сейчас работает. (Я вижу диалоговое окно из MyClass). До сих пор программа не запускается, потому что у меня есть второй конструктор в MyClass, в котором я не хочу передавать диалог (так как есть nonGUI_version). Компилятор дает мне: «неинициализированный ссылочный член« MyClass :: dialog_ »». Можете ли вы сказать мне, что делать в этом случае?
  • 0
    Затем сделайте указатель. Смотрите мой измененный ответ.
Показать ещё 1 комментарий
2
someClass(&dialog);

неверно... у вас есть указатель и укажите адрес указателя (указатель на указатель) в функции

также у вас есть

Dialog d;

в вашем заголовке и назначить ему Dialog*.

Я рекомендую вам взглянуть на: Окончательное C++ Руководство и список

  • 0
    хорошо, большое спасибо за ваш быстрый ответ. Я изменил свою программу, а также я обновил вопрос. Есть идеи, что не так?
0

Мы не знаем, как выглядит ваш класс Dialog, но если его член ui является общедоступным (или someClass является другом Dialog), то вы должны быть в состоянии сделать

dia->ui->lineEdit->setText();

Вы получаете ошибки компилятора? Или текст просто не отображается, как ожидалось? В какой-то момент вам нужно будет показать диалог, используя

dia->show();

или

dia->exec();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню