Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QPointer到主窗口_C++_Qt_Qpointer - Fatal编程技术网

C++ QPointer到主窗口

C++ QPointer到主窗口,c++,qt,qpointer,C++,Qt,Qpointer,我正在创建一个对话框窗口,想知道如何将指向MainWindow的指针传递给它 比如说,我需要从对话框的主窗口访问getter方法 主窗口声明直接来自向导: class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); 在我的对话框中。h: QPointer <MainWindow> mainw

我正在创建一个对话框窗口,想知道如何将指向MainWindow的指针传递给它

比如说,我需要从对话框的主窗口访问getter方法

主窗口声明直接来自向导:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
在我的对话框中。h:

QPointer <MainWindow> mainwindow;
这给了我一个错误:从类型“MainWindow*”到类型“QPointer::QObjectType*{aka QObjectType*}”的静态转换无效

我也不知道为什么。

用于将指针强制转换为MainWindow类型,由于文档中没有说明使用空指针构造QPointer是安全的,因此可以更安全地执行此操作

MainWindow* ptr = qobject_cast<MainWindow*>(mw_ptr);
if(ptr != 0)
    mainwindow = ptr;

或者,另一种方法是使用信号和插槽在主窗口和对话框之间进行通信。

主窗口的定义是什么?QPointer只在从QObjectHmmm派生的类上使用函数我认为这里有一个不必要的循环依赖项,我猜MainWindow将拥有该对话框。您希望在对话框中访问哪个getter?为什么不在创建对话框时将所需数据传递给对话框?显示MainWindow类declaration@RobbieE更新了declarationOk,我对您的主要问题的回答是:您可能没有在对话框的.cpp文件中包含mainwindow.h。这就是为什么编译器不知道如何强制转换它。回答我们这里的讨论,为了避免循环依赖(这通常是个坏主意),您可以:使用信号/插槽机制dialog将用您的数据发出信号,或者引入一个将传递给dialog的接口类。MainWindow可以实现这个接口,但您的对话框将依赖于接口而不是主窗口,这会破坏循环依赖性。注意:无法将“mw_ptr”类型“MainWindow*”转换为类型“QObject*”^Q_对象宏没有将QMainWindow设置为QObject?Q_对象没有将任何内容设置为QObject:它只是一个添加了一组属性的宏额外功能。但是,QMainWindow继承自QObject,因此根据定义它是QObject;。正如我在另一篇评论中所写,您可能遗漏了一些include.@MichałWalenciak好吧,也许您是对的,我需要额外的接口。谢谢,我将把问题标记为已解决。@Densistensy Michal可能打算将MainWindow.h包含到MyDialog.cpp中
MainWindow* ptr = qobject_cast<MainWindow*>(mw_ptr);
if(ptr != 0)
    mainwindow = ptr;