我想知道如何在我的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文件中包含?
感谢您的帮助:)
答案 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_cast
或qobject_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() ;