我是Qt的新手,目前正在尝试将程序的c ++部分与qml部分连接起来。连接的目的是将TreeView的当前选定项传递给qml(可能通过on_treeView_doubleClicked)。既然没有用,我尝试了所有建议的连接,在这里进行了非常基本的编程,但是我总是收到以下错误:
for filen in [x for x in os.listdir(path_to_files) if '.ares' in x]:
df1 = pd.read_table(path_to_files+filen, skiprows=0, usecols=(0,1,2,3,4,8),
names=['wave','num','stlines','fwhm','EWs','MeasredWave'],
delimiter=r'\s+'))
df1 = df1.sort_values('stlines', ascending=False).drop_duplicates('wave')
lst.append(df1)
这是我有关连接的代码片段:
test.h:
file::/main.qml:10: ReferenceError: test is not defined
test.cpp:
#ifndef TEST_H
#define TEST_H
#include <QObject>
#include <QDebug>
class test : public QObject
{
Q_OBJECT
public:
explicit test(QObject *parent = nullptr);
Q_INVOKABLE void testFunc();
signals:
public slots:
};
#endif // TEST_H
mainwindow.cpp:
#include "test.h"
test::test(QObject *parent) : QObject(parent)
{
}
void test::testFunc()
{
qDebug() << "Hello from C++!";
}
main.qml:
test testObj;
QQmlApplicationEngine engine;
ui->quickWidget->setSource(QUrl::fromLocalFile(":/main.qml"));
engine.rootContext()->setContextProperty("test", &testObj);
我将非常感谢您提供的任何帮助(不仅是简单的编程,而且还可能传递了treeView中当前选择的项)。我知道其他线程中也有一些建议,但是它们似乎对我没有用,所以请不要将此标记为重复。
预先感谢
卢卡斯
答案 0 :(得分:0)
您有3个主要错误:
如果要使用来自qresource的.qml,则不应使用QUrl::fromLocalFile()
,因为qresource不是本地文件,而是虚拟文件。
testObj
是一个局部变量,因此将在创建该函数的函数完成后将其消除,一种解决方案是使testObj
成为该类的成员。
对于最后一个错误,主要错误QQuickWidget
已经有一个QQmlEngine
,您不必创建另一个错误。
*。h
Ui::MainWindow *ui;
test testObj;
*。cpp
ui->quickWidget->setSource(QUrl("qrc:/main.qml"));
ui->quickWidget->engine()->rootContext()->setContextProperty("test", &testObj);
我的完整测试可以在下面的link
中找到