如何在QML中添加一个基于QWidget写成的类

亥尚 2015-02-10 11:24:04
如题,我现在用QML做了界面和列表显示,现在想点击列表条目就播放这个文件。这个文件的播放方法已经基于QWidget写好了,我是想直接调用,我在这就不知道如何干了。
下面的代码只是显示界面和将C++读到的列表显示出来:
#define EBK_DIR "/home/dongk/test/EbkPlayer3-0/ebk"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QString ebkpath = EBK_DIR;
QDir dir(ebkpath);

NameListModel namelist;

foreach (QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
{
namelist.addname(FileInfo(fileInfo.fileName()));
}

QQmlApplicationEngine engine;
QQmlContext *ctx = engine.rootContext();
ctx->setContextProperty("ebkmodel", &namelist);
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

return app.exec();
}
各位再添加播放方法应该如何做呢,急求啊。求各位大神解惑。。。
...全文
2568 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36242742 2018-09-04
  • 打赏
  • 举报
回复
https://download.csdn.net/download/qq_36242742/10644737
Final_Mystery 2015-02-12
  • 打赏
  • 举报
回复
看看 qmlRegisterType 这个函数,可能是你想要的
亥尚 2015-02-11
  • 打赏
  • 举报
回复
引用 3 楼 jiangcaiyang123 的回复:
QWidget中添加Qt Quick是可以的,但是反过来就不行了。原因在于QWidget使用软件栅格化渲染,Qt Quick则是使用OpenGL渲染。想要在OpenGL中挖一个洞给软件栅格化渲染,是不能实现的。
您好,我是新手,您说的有点太高深了。我现在就是用QML做了一个界面,点一下就去播放public 为 QWidget的一个类,可以直接把QML做的界面不显示或关掉,全屏显示这个基于QWidget的。 这样子也是不能实现的吗??谢谢,实在有点搞不明白啊。
亥尚 2015-02-11
  • 打赏
  • 举报
回复
引用 7 楼 jiangcaiyang123 的回复:
不要这么做,直接注册一个类 比如说Controller, 设定一下继承QObject,然后使用Q_INVOKABLE宏写一个名为show()的函数。 然后使用angine.rootContext()->setContextProperty( "controller, "&controller ); 这样在QML中就可以controller.show()了。 详情请见:这里
这是我说的那个EbkWidget那个类的实现,大神你帮忙看看吧, class EbkWidget : public QWidget { Q_OBJECT public: explicit EbkWidget(QWidget *parent = 0); ~EbkWidget(); Q_INVOKABLE void loadEbk(QString fileName);//这个就是加载函数,内部有文件的解析等等的。 QString ebkName; QImage *image; //QPixmap *pixmap; signals: public slots: protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event); }; 如果你还需要别的代码我可以给你看的。还有,下面的代码是原本直接用QWidget写的无QML的工程的main函数:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    installLogcatMessageHandler("ebook");

    EbkWidget ebkWidget;
    QString file;// = "/data/app-lib/QtApp-debug/english.ebk";
    file = QCoreApplication::applicationDirPath() + "/english.ebk";

    qDebug((char *)file.toStdString().c_str());

    ebkWidget.loadEbk((char *)file.toStdString().c_str());
    ebkWidget.show();

    return a.exec();
}
我知道这样给您添了很多麻烦,但实在没办法了,不好意思。谢谢!!!
亥尚 2015-02-11
  • 打赏
  • 举报
回复
引用 7 楼 jiangcaiyang123 的回复:
不要这么做,直接注册一个类 比如说Controller, 设定一下继承QObject,然后使用Q_INVOKABLE宏写一个名为show()的函数。 然后使用angine.rootContext()->setContextProperty( "controller, "&controller ); 这样在QML中就可以controller.show()了。 详情请见:这里
因为在show之前是需要将.ebk文件加载一下,加载的那个函数是在EbkWidget中,此类继承自QWidget,show函数不应该是QWidget中zi
引用 7 楼 jiangcaiyang123 的回复:
不要这么做,直接注册一个类 比如说Controller, 设定一下继承QObject,然后使用Q_INVOKABLE宏写一个名为show()的函数。 然后使用angine.rootContext()->setContextProperty( "controller, "&controller ); 这样在QML中就可以controller.show()了。 详情请见:这里
这是我的main函数,我在使用model的时候已经走过context的步骤,再接下来请指教一下吧,谢谢

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    const QString ebkpath = EBK_DIR;
    QDir dir(ebkpath);

    NameListModel namelist;

    foreach (QFileInfo fileInfo,  dir.entryInfoList(QDir::Files))
    {
        namelist.addname(FileInfo(fileInfo.fileName()));
    }

    qmlRegisterType<EbkWidget>("RegisterMyEbkType", 1, 0, "MyClassType");

    QQmlApplicationEngine engine;
    QQmlContext *ctx = engine.rootContext();
    ctx->setContextProperty("ebkmodel", &namelist);
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
亥尚 2015-02-11
  • 打赏
  • 举报
回复
引用 7 楼 jiangcaiyang123 的回复:
不要这么做,直接注册一个类 比如说Controller, 设定一下继承QObject,然后使用Q_INVOKABLE宏写一个名为show()的函数。 然后使用angine.rootContext()->setContextProperty( "controller, "&controller ); 这样在QML中就可以controller.show()了。 详情请见:这里
因为在show之前是需要将.ebk文件加载一下,加载的那个函数是在EbkWidget中,此类继承自QWidget,show函数不应该是QWidget中自带的那个属性吗?
彩阳 2015-02-11
  • 打赏
  • 举报
回复
不要这么做,直接注册一个类 比如说Controller, 设定一下继承QObject,然后使用Q_INVOKABLE宏写一个名为show()的函数。 然后使用angine.rootContext()->setContextProperty( "controller, "&controller ); 这样在QML中就可以controller.show()了。 详情请见:这里
亥尚 2015-02-11
  • 打赏
  • 举报
回复
引用 5 楼 jiangcaiyang123 的回复:
通过另外开一个QWidget窗口时可以的。将窗口嵌入至Qt Quick界面中不行。
恩恩,我就是要另开一个的,我现在做到如下这种程度了,就是show有问题,你能告诉我一下怎么show这个吗。。 现在有一个基于QWidget写成播放文件的工程,现在我利用QML做了一个界面,里面有列表,点击列表条目要播放这个文件。 因为播放的算法已经都写好了,遵循着不改的原则,实现上述功能。 播放的那个工程是基于QWidget的一个类--EbkWidget,里面有一个加载函数。我现在利用: qmlRegisterType<EbkWidget>("RegisterMyEbkType", 1, 0, "MyClassType"); 做成QML的一个类型,将在列表内得到的路劲和数据类型传给加载函数。接下来就是问题了,我在点击条目(MouseArea中),visible=false主窗口,此时应该怎么显示(show)出Widget呢。。。
彩阳 2015-02-11
  • 打赏
  • 举报
回复
通过另外开一个QWidget窗口时可以的。将窗口嵌入至Qt Quick界面中不行。
亥尚 2015-02-10
  • 打赏
  • 举报
回复
help~~~
亥尚 2015-02-10
  • 打赏
  • 举报
回复
在这里还想补充一个问题,就是我现在使用QDir读取文件列表的路径时绝对路径,写进app是肯定不行,我怎么才能读到app安装的当前路径???这样我直接加上在当前路径下放文件的目录就行了。新手学习,望大神指教啊。。谢谢...
彩阳 2015-02-10
  • 打赏
  • 举报
回复
QWidget中添加Qt Quick是可以的,但是反过来就不行了。原因在于QWidget使用软件栅格化渲染,Qt Quick则是使用OpenGL渲染。想要在OpenGL中挖一个洞给软件栅格化渲染,是不能实现的。

16,706

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧