Qt 5.11,QWidget并创建一个窗口并连接到信号

时间:2018-10-25 15:50:27

标签: c++ qt signals

我正在使用以下方法动态创建新窗口:

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。

1 个答案:

答案 0 :(得分:0)

已修复,我感谢eylanesc的输入,谢谢。

我必须添加呼叫:

pobjWin->showNormal();

在尝试信号/插槽连接之前,信号和插槽连接的示例现在如下所示:

QObject::connect(pobjWin->windowHandle(), &QWindow::activeChanged
                ,pobjSubNode, &clsXMLnode::windowSlotActiveChanged);