我试图弄清楚如何从QML代码中获取信号并将其连接到位于C类的插槽中 .
我从这个answer获取代码并且屏幕上显示的控件但是我无法获得信号 .
这是相关代码:
test.qml:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1
Switch{
id: swt;
checked:true;
onCheckedChanged: swt.qmlSignal();
}
menu.cpp:
Menu::Menu(QWidget *parent) :
QWidget(parent),
ui(new Ui::Menu)
{
ui->setupUi(this);
QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, this);
container->setMaximumSize(50, 20);
QObject::connect(container, SIGNAL(qmlSignal()),
this, SLOT(receiveFromQml()));
view->setSource(QUrl("qrc:/test.qml"));
ui->verticalLayout->addWidget(container);
}
void Menu::receiveFromQml()
{
qDebug() << "Called the C++ slot with message:" ;
}
我看了一些例子here但是我无法让它起作用 .
这是我得到的错误:
qrc:/test.qml:10:TypeError:对象的属性'qmlSignal'Switch_QMLTYPE_4(0x291ac70)不是函数
2 回答
简单,将其标记为插槽
看起来你有一个C对象,你需要调用一个插槽,所以将该函数标记为
slot
,然后它会自动显示 . 在C中不需要奇怪的connect() .还有其他方法可以做到,但似乎这涵盖了你的情况 . 如果没有,请详细说明,我们将对其进行改进 .
我希望您的示例足够,并且切换项也是根目录 . 这通常解决如下:
Qt article详情 . 此外,您可以在需要时使用限定符
swt
,以便在该文件中的其他上下文中使用swt.qmlSignal()
.此外,C部分也需要修复:
我通过查看发出类似信号的自己的代码进行了更改,但实际上没有尝试,但是您需要连接到从QML
view
的rootObject
而不是它的widget容器中暴露的信号 .