c++和qml混合编程 怎么获得选中的值

Shalves 2017-08-29 03:47:39
应用场景:
在触摸屏设备(ubuntu系统)上使用qt widgets application创建工程,有一个数据列表界面需要用户选择,类似安卓手机上
在通讯录选择联系人,widgets application 实现不了类似安卓上的滑动效果,想在程序中嵌入qml,解决数据列表滑动的问
题。所以在windows上写了一个例子模拟这个功能。
例子要实现的功能:
1、qt widgets application 工程嵌入qml
2、数据列表显示
3、能数据刷新和选中
4、qml单击事件通知c++并获得qml的选中值打印到控制台
已解决的问题:
1、2、3
未解决的问题:
4
qml 文件main.qml
import QtQuick 2.0
ListView {
width: 100; height: 100

id : m_listView
objectName: "quitListView";
anchors.fill: parent
clip : true
orientation : ListView.Vertical
snapMode : ListView.NoSnap
model: myModel
delegate:numberDelegate
spacing: 2
focus: true
signal testClicked(color colParam);
Component {
id: numberDelegate

Rectangle {
width: ListView.view.width
height: 40
color: ListView.isCurrentItem?"#157efb":"#53d769" //选中颜色设置
border.color: Qt.lighter(color, 1.1)
Text {
anchors.centerIn: parent
font.pixelSize: 20
text: modelData
}
MouseArea {
anchors.fill: parent
onClicked:
{
m_listView.currentIndex = index //实现item切换
console.log("onPressed:", index) ;
emit: testClicked(index);
}
}
}
}
}
//-------------------------------------------------------------------------------------main.cpp
#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();

return a.exec();
}
//-----------------------------------------------------------------------------------------dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include<QtQuick/QQuickView>
#include<QVBoxLayout>
#include<QQmlContext>
#include<QDebug>
#include<QtQuick/QQuickItem>
QQmlContext *ctxt;
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, this);
QStringList dataList;
dataList.append("Item 1");
dataList.append("Item 2");
dataList.append("Item 3");
dataList.append("Item 4");
dataList.append("Item 5");
dataList.append("Item 6");
dataList.append("Item 7");
dataList.append("Item 8");
ctxt = view->rootContext();
ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));

container->setMinimumSize(200, 200);
container->setMaximumSize(200, 200);
container->setFocusPolicy(Qt::TabFocus);
view->setSource(QUrl("main.qml"));
QVBoxLayout *verticalLayout = new QVBoxLayout;
verticalLayout->addWidget(container);
verticalLayout->addWidget(ui->pushButton);
verticalLayout->addWidget(ui->aaa);
this->setLayout(verticalLayout);
}
Dialog::~Dialog()
{
delete ui;
}
//刷新数据按钮事件
void Dialog::on_pushButton_clicked()
{
QStringList dataList;
dataList.append("Item 9");
dataList.append("Item 21");
dataList.append("Item 3");
dataList.append("Item 42");
dataList.append("Item 53");
dataList.append("Item 64");
dataList.append("Item 75");
dataList.append("Item 86");
ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));
}
如果觉得分低的话可以加微信发红包
...全文
356 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zarelaky 2017-09-07
  • 打赏
  • 举报
回复
1.用QObject的子类AAA使用Q_PROPERTY导出一个可读写属性index, 用setContextProperty("AAA", obj)导出到QML中 在onClicked中使用AAA.index=index, 2.使用Q_INVOKABLE 声明一个AAA的成员函数,同样使用setContextProperty导出, qml中使用 AAA.setIndex(index)

16,201

社区成员

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

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