我正在使用以下方法动态创建新窗口:
QWidget* pobjWin = new QWidget();
pobjNode->setWidget(pobjWin);
pobjWin->resize(intWidth, intHeight);
pobjWin->move(intX, intY);
这有效,在我的应用程序中,我有3个窗口,我想连接到各种信号,根据在线文档,它们是:
activeChanged
contentOrientationChanged
focusObjectChanged
...
在我的应用程序中,我通过以下方式连接到这些信号:
QObject::connect(pobjWin, SIGNAL(activeChanged(void))
,pobjSubNode
,SLOT(windowSlotActiveChanged(void)));
指针'pobjSubNode'指向一个类,该类为我连接到的每个信号定义了插槽。
运行此命令并执行连接时,我得到:
2018-10-25 16:26:39.550030+0100 XMLMPAM[2048:219099] QObject::connect: No such signal QWidget::activeChanged(void) in ../XMLMPAM/clsMainWnd.cpp:733
我认为问题是因为pobjWin指向QWidget而不是QWindow,但是我找不到没有这种方式创建窗口的示例。
[编辑]使用新的连接方法:
QObject::connect(pobjWin, &QWindow::activeChanged
,pobjSubNode, &clsXMLnode::windowSlotActiveChanged);
activeChanged和windowSlotActiveChanged的原型相同。但是,当我使用此实现进行构建时,会得到:
/Users/simonplatten/XMLMPAM/clsMainWnd.cpp:733: error: no matching function for call to 'connect'
QObject::connect(pobjWin, &QWindow::activeChanged
^~~~~~~~~~~~~~~~
[Edit2]我已将连接更改为:
QObject::connect(pobjWin->windowHandle(), &QWindow::activeChanged
,pobjSubNode, &clsXMLnode::windowSlotActiveChanged);
现在我得到了:
2018-10-25 17:37:22.299066+0100 XMLMPAM[2930:423194] QObject::connect: invalid null parameter
刚刚分配:
QWindow* pobjW2 = pobjWin->windowHandle();
我在调试器中看到pobjW2为NULL,这说明了错误。
更改线路:
QWidget* pobjWin = new QWidget();
收件人:
QWindow* pobjWin = new QWindow();
已经解决了连接问题,一旦我解决了所有使用QWindow版本而不是QWidget版本的方法,但是现在我没有任何可见的窗口...正在调查。奇怪的是,QWindow中的方法与在QWidget中具有完全相同功能的方法具有不同的名称。
[编辑3]解决了有关纠正连接的问题并在创建连接之前插入对showNormal的调用之后。该代码与最初发布的代码完全相同,在连接之前先调用pobjWin-> showNormal。
答案 0 :(得分:0)
已修复,我感谢eylanesc的输入,谢谢。
我必须添加呼叫:
pobjWin->showNormal();
在尝试信号/插槽连接之前,信号和插槽连接的示例现在如下所示:
QObject::connect(pobjWin->windowHandle(), &QWindow::activeChanged
,pobjSubNode, &clsXMLnode::windowSlotActiveChanged);