Qt4:访问父类的最佳方式(1级,2级......)

时间:2011-03-25 00:43:50

标签: c++ oop qt qt4

我想知道如何在我的Qt应用程序中访问父类。 让我们说我的项目有以下结构:

mainWindow: MainWindow
    tabWidget: QTabWidget
        tab1: MySubClass1
        tab2: MySubClass2
            tabWidget: QTabWidget
                xtab1: MySubSubClass1
                xtab2: MySubSubClass2

有点简化。 我想要做的是从xtab2插槽函数之一访问mainWindows对象。

(1)什么是最好的方法? 我试图沿着树将指针传递给mainWindow,但是我遇到了运行时错误。

(2)我应该在xtab.h文件中包含mainwindow.h还是应该在xtab.cpp文件中包含?

感谢您的帮助:)

5 个答案:

答案 0 :(得分:3)

如果你真的需要主窗口,传递MainWindow指针是最好的方法。静态方法的缺点是它将停止使用多个主窗口。

我建议尽量避免从包含的小部件访问主窗口,而是使用信号。 E.g:

class MainWindow {
    public:
        explicit MainWindow( QWidget* parent=0 ) {
            tab = new TabWidget;
            ...
            MySubSubClass1* ssw1 = new MySubSubClass;
            connect( ssw1, SIGNAL(textChanged(QString)), this, SLOT(page1TextChanged(QString));
            tab->addWidget( ssw1 );
        }

   private Q_SLOTS:
         void page1TextChanged( const QString& ) {
             //do something...
         }  
};

MySubSubClass1然后发出textChanged(),addresseeChanged()(例如在地址簿中),或者在更高层次上有意义的抽象或细节层次。这样,MySubSubClass是通用的,根本不需要了解MainWindow。它可以在任何其他环境中重用。如果MySubSubClass本身包含其他小部件,它可以再次连接到它们的信号。

答案 1 :(得分:2)

您可以在MainWindow中创建一个静态方法和对象,它将返回mainwindow对象。

这样的事情:

private:
     static MainWindow* _windowInstance

public:
     static MainWindow* windowInstance()
     {
          return _windowInstance;
     }

在大多数情况下,这似乎是简单的解决方案。现在,只要需要访问此对象,就必须包含mainwindow.h。

并且不要忘记在构造函数中初始化_windowInstance,就像这样;

_windowInstance = this;

答案 2 :(得分:1)

通过父类,我认为你的意思是父小部件?

如果您想查找顶级窗口小部件,QWidget::window()会指向您。使用dynamic_castqobject_cast将其转换为您的MainWindow对象。

如果您想上升到某个级别,请使用paerntWidget()

答案 3 :(得分:1)

这个问题有多种不同的解决方案,你选择的解决方案是面向对象,封装是最​​糟糕的解决方案之一。一些想法

  • 封装:如果您发现自己必须提供相对较远距离的访问(沿着一长串容器或子类),您可能需要查看您尝试分发的功能。我可能认为它应该被封装在一个类中,它可以比当前所在的位置更容易传递(在你的情况下是主窗口)。

  • 抽象:除非你需要访问QMainWindow的功能,否则不要将指针传递给你的MainWindow类,为你需要的功能创建一个接口,让你的MainWindow实现接口和传递接口类型的对象而不是您的MainWindow类型。

  • 信号和插槽:正如Frank所说,使用Qt的信令机制实现适当的功能,这使得调用者和被调用者之间的连接成为动态连接,再次将其与实际的MainWindow类分开

    < / LI>
  • QApplication:如果您必须让全局信息限制入口点,那么您已经有一个单独的QApplication对象,使其成为需要全局访问的所有其他对象的维护者,派生您自己的QApplication在那里分类并维护全局引用。然后,您的QApplication类可以创建或销毁所需的全局对象。

有关您需要对MainWindow实例执行的操作或需要传达的内容的更多信息,您也可以获得更好的答案

答案 4 :(得分:0)

QWidget* parent = this ;
while (parent -> parentWidget()) parent = parent -> parentWidget() ;