用指针传递QObject(Qt)

时间:2014-09-11 14:40:51

标签: c++ qt pointers

我的目标是将windowobject指针传递给另一个类。 我会告诉你到目前为止我得到了什么。 其中:"对话框"是通过的窗口。

mainwindow.cpp

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

某些类中的Konstruktor

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

someClass.h

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

该程序现在运行,但我不确定我是否实现了我想要的。 现在可以与我的对话框进行交互吗? 我想要的是这样的。

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

任何帮助都是适当的

3 个答案:

答案 0 :(得分:2)

someClass(&dialog);

不正确...你有一个指针,并在函数中给出指针的地址(一个指向指针的指针)

你也有

Dialog d;
在标题中

并为其分配Dialog*

我建议您查看:The Definitive C++ Book Guide and List

答案 1 :(得分:0)

我们不知道您的Dialog课程是什么样的,但如果其成员ui是公开的(或someClassDialog的朋友),那么您应该能够做到

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

您是否收到编译错误?或者文本根本没有按预期显示? 您仍然需要使用

在某个时刻显示对话框
dia->show();

dia->exec();

答案 2 :(得分: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(假设对话框是一个QObject),因为QPointers比原始指针更安全(它们总是初始化为零,至少)

我将告诉你现在保持简单的基本原则。阅读有关QPointers和智能指针的一般信息。

e.g:

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 );
    }
  }
}