Моя цель - передать указатель 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();
Любая помощь будет назначена
Моя цель - передать указатель 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 );
}
}
}
someClass(&dialog);
неверно... у вас есть указатель и укажите адрес указателя (указатель на указатель) в функции
также у вас есть
Dialog d;
в вашем заголовке и назначить ему Dialog*
.
Я рекомендую вам взглянуть на: Окончательное C++ Руководство и список
Мы не знаем, как выглядит ваш класс Dialog
, но если его член ui
является общедоступным (или someClass
является другом Dialog
), то вы должны быть в состоянии сделать
dia->ui->lineEdit->setText();
Вы получаете ошибки компилятора? Или текст просто не отображается, как ожидалось? В какой-то момент вам нужно будет показать диалог, используя
dia->show();
или
dia->exec();