如何在qt下调试qml-20120119
QML教程
QML入门教程(1)QML是什么?QML是一种描述性的脚本语言,文件格式以.qml结尾。
语法格式非常像CSS(参考后文具体例子),但又支持javacript形式的编程控制。
它结合了QtDesigner UI和QtScript的优点。
QtDesigner可以设计出.ui界面文件,但是不支持和Qt原生C++代码的交互。
QtScript可以和Qt原生代码进行交互,但是有一个缺点,如果要在脚本中创建一个继承于QObject的图形对象非常不方便,只能在Qt代码中创建图形对象,然后从QtScript中进行访问。
而QML 可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便。
如何使用?在Qt C++文件中通过QDeclarativeView加载,就像使用UiLoader加载.ui文件一样。
不过本文不会去介绍如何在Qt C++中使用QML,而是把重点放在QML的语法上,不过别担心看不到.qml文件的效果。
Qt提供了一个工具QML Viewer可以查看.qml文件生成的效果,该程序在Qt的bin目录下,应用名字叫qml(Windows下叫qml.exe)。
所以你在看到别人提供的.qml文件时,你可以用下面命令qml filename.qml查看.qml的执行结果,咱们的第一个Hello,World生成界面如下开始QML吧上面的Hello,World源代码如下第1行是Qt QML的统一用法,指明当前QML会使用Qt-4.7里已经定义好的类型,比如第3行的Rectangle和第8行的Text。
第3行开始至文章结束处则定义了一个矩形的图形区域对象,第4行则申明了该矩形区域对象的id为”page”可以被其它对象识别并通过该id访问其成员属性,另外几个属性width/height/color则很好理解,语法跟CSS类似,可以写在一行中用分号”;”隔开。
第8行至第12行则是一个文本对象,看它代码的嵌套结构可以知道它是内嵌于Rectangle 的。
QML说明
QML说明实现Qt和Qml交互的三种办法1、使用QDeclarativeView实现信号和槽QDeclarativeView view;view.setSource(QUrl(“main.qml”));QObject* object = reinterpret_cast(view.rootObject());此时object代表就是qml对应的QObject,因此可以从object 中获得qml的信号和槽。
优点:缺点:1、假如ButtonRect.qml是Main.qml的一个item的话,这时候就不能得到ButtonRect.qml的信号和槽,因为你加载的是main.qml2、使用QMetaObject具体跟1一样,也可以使用QDeclarativeEngine和QDeclarativeComponent先获得Object,在使用QMetaObject::invokeMethod()优点:可以不显示就调用qml里面的函数,缺点:只能是单向的,qml没有办法调用qt里面的函数。
3、Qml调用Qt里面的函数view.rootContext()->setContextProperty("L", new Mainwindow);优点:能在qml里面直接使用mainwindow的对象L调用其函数缺点:不能调用qml的函数上面三种方法都不能实现弥补方法1的缺点,目前还没办法解决1的问题qt与javascript 交互信息传输信息交流javascript响应qt信号qt 获取javascript的数据最近在研究google地图API,想要用qt处理网页数据,获取地图并交互,首先在qt的pro里加载webkit:QT +=webkit然后使用qt的#include:#include#include //SIGNAL(javaScriptWindowObjectCleared())从这里才有class WebView: public QWebView{Q_OBJECTpublic:WebView();public slots:void add_java_script_object();}首先要在类里加载web(地图),看这里/%C6%BE%C8%F12/blog/item/8f5fc7acd9be 3de91e17a2aa.html 然后在构造里加这个connect(this->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),this,SLOT(add_java_script_object()));//当有页面下载或者刷新时调用自己的曹函数;void WebView:: add_java_script_object(){this->page()->mainFrame()->addT oJavaScriptWindowObjec t//核心,这一句告诉javascript可以看到“this”(也可以是其他的object),的函数("WebView", this);}至此javascript就能调用qt的函数并且传参了(实现从网页调用qt的函数)。
Qt中使用qml的方法
Qt中使用qml的方法1. 创建QML文件:首先,在Qt项目中创建一个QML文件,它将包含应用程序的界面和逻辑。
可以使用Qt Creator来创建QML文件,也可以通过手动创建一个新文件并添加.qml扩展名来创建。
2. 定义元素和属性:在QML文件中,可以定义不同的元素和属性,用于构建用户界面。
例如,可以定义Rectangle元素来创建一个矩形,并使用width和height属性设置其大小。
可以使用Text元素创建文本,并使用text属性设置其内容。
3.绑定属性:QML提供了一种特殊的语法来绑定属性。
通过属性绑定,可以使一个属性的值依赖于另一个属性的值。
例如,可以将一个矩形的宽度绑定到另一个元素的宽度,使它们自动同步。
4. 处理用户输入:QML允许在用户界面上处理用户输入事件。
可以为元素添加一个鼠标区域,以便在用户点击时触发相应的逻辑。
可以使用鼠标的clicked信号来指定一个JavaScript函数,该函数将在点击事件发生时调用。
5.使用组件:QML支持组件的概念,允许将界面及其相关逻辑封装为可重用的单元。
可以创建自定义组件并将其包含在其他QML文件中。
这样可以提高代码的可维护性,并使界面设计更加模块化。
6. 与C++交互:尽管QML可以独立于C++使用,但在一些情况下,可能仍然需要在QML和C++之间进行交互。
可以在QML中使用Qt的信号和槽机制来与C++代码进行通信。
通过将QObject派生类公开给QML,可以在QML中访问其属性和方法。
7. 使用QML预览:使用Qt Creator,可以在开发过程中轻松预览和调试QML文件。
可以通过Qt Quick Designer来可视化设计界面,并查看实时预览。
还可以使用Qt Quick Controls进行快速原型开发。
总结:Qt中使用QML提供了一种声明性语言来构建用户界面和应用程序逻辑。
通过定义元素和属性,绑定属性,处理用户输入,使用组件和与C++交互,可以创建强大和易于维护的应用程序。
qt中qml的用法
qt中qml的用法
QML(Qt Meta-Object Language)是一种声明性语言,用于设计
用户界面。
它是Qt框架中的一部分,用于开发跨平台的应用程序。
以
下是QML在Qt中的用法:
1. 定义QML文件:创建一个后缀名为.qml的文件,并使用QML
语法编写界面的结构和外观。
2. 导入Qt模块:使用import语句导入Qt模块,例如导入Qt Quick和Qt Quick Controls模块。
3. 创建界面元素:使用QML中的元素来创建界面元素,如Rectangle、Text、Image等。
4. 进行属性绑定:通过使用属性绑定语法,将属性值绑定到其
他对象的属性上。
例如,可以将文本的内容绑定到某个变量。
5. 响应用户事件:使用信号和槽机制来响应用户的操作。
可以
使用on关键字来定义事件处理程序,如鼠标点击、键盘按键等。
6. 使用属性动画:通过QML中的动画属性来创建、调整和控制
动画效果。
可以在元素上定义动画属性,如位置、大小、透明度等。
7. 处理数据模型:使用QML中的ListModel和ListView来处理
和显示数据模型。
可以将数据与可视组件关联起来,并动态更新视图。
8. 访问C++代码:使用Qt提供的接口,可以在QML中访问C++
代码。
可以创建将C++对象公开给QML的类,并在QML中直接使用。
以上是在Qt中使用QML的一些常见用法。
QML提供了一种简洁、灵活和易于理解的方法来设计和实现用户界面,使得开发者能够轻松
创建现代化的界面。
QT调用mplayer(转) - scutLiu的专栏 - CSDN博客
QT调用mplayer(转) - scutLiu的专栏- CSDN博客scutLiu的专栏To Be A Better Man!条新通知登录注册欢迎退出我的博客配置写文章文章管理博客首页全站当前博客空间博客好友相册留言用户操作[留言] [发消息] [加为好友]狼的图腾ID:scutLiu共2693次访问,排名2万外,好友10人,关注者10人。
狼的图腾的文章原创17 篇翻译0 篇转载36 篇评论4 篇订阅我的博客[编辑]scutLiu的公告学无止境![编辑]文章分类C/C++/C#Linux内核/应用开发Open SourceQT设计模式数据库编程随笔他山之石行业应用存档2010年08月(3)2010年07月(3)2010年06月(13)2010年05月(11)2010年04月(7)2010年03月(7)2010年02月(3)2010年01月(6)公告:[意见反馈][官方博客] QT调用mplayer(转) 收藏转自/aoxuehan424/blog/item/348888c45b186bc138db49d7.html暂时知道播放歌曲。
安装mplayer,之后目录下会有个mplayer-core.exe 提取出来。
放到源码下面。
代码:QProcess *mplayerProcess = new QProcess(this); QString exefile = "mplayer-core.exe";QStringList arg;// arg << "-slave";// arg << "-quiet";// arg << "-idle"; 如果想不播放歌曲的时候就退出mplayer,那么这个参数不要加arg << "D:/temp/PhonoTest/PhonoTest/1.mp3"; mplayerProcess->start(exefile,arg);这个文件有12.9M。
qml父控件调用子控件方法
qml父控件调用子控件方法【原创版3篇】目录(篇1)1.QML 简介2.父控件与子控件的关系3.调用子控件方法的方式4.实际应用示例正文(篇1)一、QML 简介QML(Qt Quick)是 Qt 框架中的一种用于创建触摸设备的用户界面的语言。
它提供了许多内置的控件和组件,使得开发者可以轻松地构建出具有丰富交互功能的应用程序。
在 QML 中,我们可以通过父控件与子控件的关系来实现更为复杂的界面设计。
二、父控件与子控件的关系在 QML 中,一个控件可以包含另一个控件,形成一种层次关系。
包含其他控件的控件被称为父控件,而被包含的控件被称为子控件。
通过这种关系,我们可以实现诸如按钮点击事件触发、文本输入框内容改变等交互功能。
三、调用子控件方法的方式在 QML 中,我们可以通过以下方式调用子控件的方法:1.使用`onClicked`事件:当用户点击子控件时,会触发`onClicked`事件。
我们可以在父控件中监听这个事件,并在事件处理函数中调用子控件的方法。
例如:```Button {text: "点击我"onClicked: {childControl.someMethod()}}```2.使用`signal`与`slot`:在子控件中,我们可以定义一个`signal`,当满足某个条件时发出这个信号。
在父控件中,我们可以定义一个`slot`来接收这个信号,并在槽函数中调用子控件的方法。
例如:```TextField {id: textFieldtext: "输入内容"onTextChanged: {if (text == "特定内容") {signal someSignal}}}Button {text: "点击我"onTriggered: {textField.someSignal.connect(someMethod)}}```四、实际应用示例假设我们有一个简单的应用程序,包含一个按钮和一个文本框。
qml调用父类的函数
qml调用父类的函数QML(Qt Query Language)是一种基于JavaScript的声明式编程语言,用于查询和操作Qt应用程序中的数据。
在QML中,我们可以通过继承和多态实现父子类之间的通信。
本文将介绍如何在QML中调用父类的函数。
1.QML简介QML是一种轻量级的编程语言,用于简化创建基于UI的Qt应用程序。
它具有简洁的语法和强大的功能,使得开发人员可以轻松地构建交互式用户界面。
2.父类与子类关系在QML中,子类可以通过继承父类来获得其属性和方法。
这意味着子类可以重写或扩展父类的属性和方法。
为了实现父子类之间的通信,我们需要在子类中调用父类的函数。
3.调用父类函数的方法在QML中,子类可以通过以下方式调用父类的函数:- 首先,确保父类定义了一个信号(signal),用于子类监听。
- 然后,在子类中定义一个槽(slot)函数,该函数将接收来自父类的信号。
- 最后,在子类中使用`on`关键字监听父类的信号,并将槽函数作为参数传递。
实例演示以下是一个简单的实例,展示了如何在QML中调用父类的函数:```qml// 父类class Parent {signal signal1();void function1() {console.log("这是父类的函数1");}}// 子类,继承自Parentclass Child extends Parent {void slot1(string message) {console.log("收到来自父类的信号:", message);}@property string message;}// 主函数function main() {Child child;child.message = "Hello, World!";child.signal1().connect(child.slot1);child.function1();}```在这个例子中,我们定义了一个父类`Parent`和一个子类`Child`。
Qt QML入门– QML 语法
Qt QML入门– QML 语法考后文具体例子),但又支持javascript形式的编程控制。
我个人认为它结合了QtDesigner UI 和QtScript的优点。
QtDesigner可以设计出.ui界面文件,但是不支持和Qt原生C++代码的继承于QObject的图形对象非常不方便,只能在Qt代码中创建图形对象,然后从QtScript同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便。
QML是Qt推出的Qt Quick技术的一部分,是一种新增的简便易学的语言。
QML是一种陈述性语言,用来描述一个程序的用户界面:无论是什么样子,以及它如何表现。
在QML,一个用户界面被指定为具有属性的对象树。
这使得Qt更加便于很少或没有编程经验的人使用。
发表于2013 年 2 月 3 日▪id -id 标识text:"Hello, "+ someText.text}上面的MyLabel类型中中有个default属性someText,所以在MyLable使用的时候,MyLabel{Text{ text:"world!"}}//和这段代码是等效的MyLable{someText:Text{ text:"world!"}}这就是default property单行语句的分号是可写不用写的。
但是一行写多条语句,语句则必须要用分号分隔!propertyType可以是QML的基本类型,一种QML对象类型,也可以是QML可以是C++通过Q_PROPERTY宏注册的类,还可以是JavaScript中的var,var它可以表示任何类型的数据,还可以是自定义的QML类型,如MyCustomRectangle为P R O P E R T Y A T T R I B U T E S赋值▪一是初始化的时候赋值import QtQuick 2.0 Item{ x: 10 y: 10 width: 100 height: 100 }▪一是使用的时候赋值。
qt mvc框架调用流程
qt mvc框架调用流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 创建模型(Model):定义数据结构和数据操作方法。
qt 调用基类方法
qt 调用基类方法在Qt中,如果想要调用基类的方法,可以通过使用父类的指针来实现。
下面我们将详细说明如何在Qt中调用基类的方法。
首先,要调用基类的方法,我们需要创建一个子类,并将父类作为子类的父类。
例如,我们创建一个名为MyWidget的子类,继承自QWidget:```class MyWidget : public QWidget```接下来,在子类中,我们可以调用父类的方法。
要调用父类的方法,我们需要使用父类的指针来调用。
在Qt中,父类的指针可以通过使用`parent()`方法来获取。
例如,如果我们想要在子类中调用父类的`resize()`方法,可以通过以下方式实现:```void MyWidget::resizeEvent(QResizeEvent *event){QWidget::resizeEvent(event);// 调用父类的resize方法parentWidget()->resize(500, 500);}```在上面的代码中,我们重写了子类的`resizeEvent`方法,并在其中通过调用`parentWidget()`方法来获取父类的指针,并使用`resize()`方法来调用父类的`resize()`方法。
除了使用父类的指针来调用父类的方法外,我们还可以使用父类的关键字`Base`来调用基类的方法。
例如,如果我们的子类是基于`QLineEdit`的自定义子类,我们可以通过以下方式调用基类的`setText()`方法:```class MyLineEdit : public QLineEdit{public:MyLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) {}// 调用基类的setText方法void setBaseText(const QString &text){Base::setText(text);}};```在上面的代码中,我们通过使用`Base::`来指定调用基类的方法。
qt qml c++ 的一般设计流程
qt qml c++的一般设计流程Qt是一个跨平台的应用程序和UI开发框架,可以与C++结合使用。
在使用Qt进行开发时,特别是涉及QML(Qt Modeling Language)和C++的设计流程通常包括以下步骤:1.初始规划和设计●需求分析:确定项目需求,包括功能、用户界面设计等方面。
●架构设计:规划应用程序架构,决定如何分割任务和功能,以及哪些部分使用QML和C++。
2.QML UI设计●界面设计:使用QML创建应用程序的用户界面,包括布局、视觉效果和用户交互元素。
●数据模型:定义数据模型以供QML中的视图使用,可以是C++中的数据模型。
3.C++逻辑和后端●逻辑开发:使用C++编写后端逻辑、算法和处理数据的功能。
●与QML交互:使用Qt提供的信号和槽机制,将C++后端和QML前端连接起来,实现数据传输和交互。
4.测试和调试●单元测试:针对代码中的单个功能或模块进行测试。
●集成测试:测试整个应用程序的功能和交互。
●调试和修复错误:解决代码中的bug,并确保应用程序的稳定性和正确性。
5.部署和发布●构建和部署:生成可执行文件,并准备发布所需的文件和资源。
●发布:将应用程序发布到目标平台,可能涉及特定平台的打包、发布流程等。
6.维护和更新●更新和优化:根据用户反馈和需求持续更新应用程序,可能包括修复漏洞、优化性能等。
这些步骤是一个一般性的设计流程,在实际项目中可能会因项目规模、复杂性和团队结构而有所不同。
在Qt中,结合QML和C++的设计方式允许开发者充分利用QML的灵活性和C++的高性能特性,实现丰富的用户界面和强大的后端逻辑。
QT调试详细操作步骤及案例分析
QT调试详细操作步骤及案例分析Qt是一个跨平台的应用程序开发框架,可以用于快速开发各种类型的软件。
Qt提供了一套完整的开发工具和库,包括了IDE、GUI设计工具和调试工具。
下面是Qt调试的详细操作步骤及案例分析。
步骤一:添加调试信息在Qt工程中,可以通过在.pro文件中添加`CONFIG += debug`来启用调试信息的生成。
例如:```CONFIG += debug```这样可以确保在编译时生成调试信息,便于后续的调试操作。
步骤二:设置断点断点是调试的关键工具之一,可以让程序在特定位置暂停执行,以便观察程序的运行状态。
可以通过在代码行的左侧单击鼠标左键来设置断点,也可以使用快捷键F9来设置。
步骤三:运行调试器在Qt Creator中,可以通过单击工具栏上的“调试”按钮来启动调试器。
启动调试器后,程序会在设置的断点处暂停执行,此时可以逐步执行代码,并观察变量的值,以及观察程序执行过程中是否出现了异常。
步骤四:调试信息的查看和修改在调试器中,可以查看和修改程序中的变量值,以及查看函数的调用栈等信息。
可以通过右侧的“局部变量”、“全局变量”、“表达式求值”等面板来查看各种信息。
此外,还可以通过输入特定的命令来执行一些调试器命令,如打印变量的值、跳转到特定的代码行等。
案例分析:下面是一个简单的Qt程序的案例分析,通过调试器来查找程序中的问题。
```cpp#include <QtCore/QCoreApplication>#include <QDebug>int main(int argc, char *argv[])QCoreApplication a(argc, argv);int sum = 0;for(int i = 0; i < 10; i++)sum += i;qDebug( << "i = " << i << ", sum = " << sum;}return a.exec(;```在这个程序中,我们使用for循环将变量i从0加到9,并且在每次循环结束后输出i和sum的值。
qt ui和QML整合
qt ui和QML整合----89fd59b4-6ea4-11ec-ac22-7cb59b590d7d qt-ui和qml整合有很多方法可以将QML集成到基于QWidget的UI程序中,具体方法取决于现有UI代码的特性。
与基于qwidget的ui整合如果您已经有了基于qwidgets的UI,那么可以使用QdeCrativeView集成QML widgets。
Qdeclarativeview是qwidgets的一个子类,因此您可以像其他qwidgets一样将其加载到UI中。
具体方法是使用qdeclarativeview::setsource()方法将QML文件加载到视图中,然后将视图(即qdeclarativeview)添加到UI中。
平原1.qdeclarativeview*qmlview=newqdeclarativeview;2.qmlview->setsource(qurl::fromlocalfile(\3.4.qwidget*widget=myexistingwidget();5.qvboxlayout*layout=newqvboxlayout(widget);6.widget->addwidget(qmlview);这种方法的缺点是,与qwidgets相比,QDelaraview的初始化过程更慢,占用更多内存。
创建大量Qdelavivew对象可能会导致性能下降。
在这种情况下,更好的选择是用QML 重写小部件,并使用mainqml小部件加载小部件,而不是qdelativeview的滥用。
请注意,qwidgets的ui设计理念与qml并不相同,所以将基于qwidget的应用移植到qml并不总是一个好主意。
如果你的ui是由少数几个复杂、静态的元素的组成,使用qwidgets是一个更好的选择。
而如果你的ui是由大量简单、动态的元素组成,那么qml 则是你的最佳选择。
基于qgraphicsview与UI的集成将qmlwidgets加入到qgraphicsscene1.qgraphicscene*scene=MyExistingGraphicscene();2.qdeclarativeengine*engine=newqdeclarativeengine;推荐使用下面的一些qgraphicsview选项来优化qmluis的性能:你知道吗???Qgraphicsview::setoptimizationflags(Qgraphicsview::dontsaveinterstate)Qgraphicsview::setviewportupdatemode(Qgraphicsview::boundingrectviewportupdate)QGraphicsCene::setitemdexmethod(QGraphicsCene::Noindex)在QML中加载qgraphicswidget对象。
qt中qml的用法
qt中qml的用法Qt中QML的常用用法1. 什么是Qt中的QMLQML是一种用于创建用户界面的声明性语言,能够轻松地与C++代码进行交互,是Qt框架中的一部分。
2. QML的基本语法•QML的基本结构由Item对象组成,每个Item对象都可以包含其他Item对象。
•QML中有许多常用的元素,如Rectangle、Text、Image等,可以用来创建界面元素。
•QML使用属性来设置元素的外观和行为,属性值可以是常量或表达式,例如width: 100。
•QML中使用信号与槽的机制实现事件处理,通过on 来指定信号,并使用函数绑定到槽。
3. 创建窗口•可以使用Window元素创建一个窗口,在窗口中可以添加其他的元素。
Window {width: 800height: 600Rectangle {width:height:color: "lightblue"}}4. 布局•QML中提供了许多布局元素,以方便进行界面布局。
例如ColumnLayout和RowLayout。
ColumnLayout {spacing: 10Rectangle { width: 100; height: 100; color: "red" } Rectangle { width: 100; height: 100; color: "green" } Rectangle { width: 100; height: 100; color: "blue" } }•也可以使用anchors属性来实现布局,通过设置元素与其他元素的对齐方式来控制位置。
Rectangle {width: 200height: 200Rectangle {width: 100height: 100color: "red": parent}}5. 数据模型与视图•可以使用ListModel来创建数据模型,然后使用ListView来展示数据。
qml使用例子
qml使用例子QML是一种基于Qt库的标记式语言,由于其简洁的语法和高效的性能,成为了嵌入式系统和移动开发中的主流图形界面设计语言。
在QML中,可以用JavaScript绑定属性和信号槽,在实现图形交互逻辑时,前端控制简单明了,交互灵活和可读性高,下面将介绍QML的一些使用例子。
1、界面布局界面布局是应用程序开发中非常重要的一个方面,QML提供了多种布局方式,可通过控制其属性细节来进行适配。
例如,使用ColumnLayout对象,可以使子元素按竖直方向排列。
当子元素比布局高度小时,可以通过设置Layout.alignment属性,对齐方式来实现居中、左对齐等,当前布局中的所有子元素会以相同的方式对齐。
以下是一个简单的例子:```import QtQuick 2.12import youts 1.12ColumnLayoutanchors.fill: parentspacing: 10Rectanglewidth: parent.widthheight: 50color: "red"}Rectanglewidth: parent.widthheight: 50color: "blue"}Rectanglewidth: parent.widthheight: 50color: "green"}Layout.alignment: Qt.AlignCenter```2、按钮事件处理在QML中,控件的事件响应机制非常方便。
用户在视图里面进行操作,例如按下按钮、鼠标点击等,会引发特定的信号,可以使用JavaScript语句来处理这些信号。
下面是一个简单的例子,演示如何处理Button对象的clicked信号。
```Rectanglewidth: 300height: 200Buttonid: button1te某t: "Click me"anchors.centerIn: parentonClicked:console.log("Button clicked!")}}```每次单击按钮时,console.log函数都会记录“Button clicked!”的消息。
Qt下Excel操作
Qt之操作Excel(2013-12-06 13:57:20)转载▼分类:Qt标签:qtqaxobjectqt操作excelqtvbaexcelvbaVisual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。
也可说是一种应用程式视觉化的Basic Script。
1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。
在VBA的参考手册中就可以看到具体函数、属性的用法,Qt操作Excel主要通过QAxObject+ Excel VBA来实现!关于Qt对Excel的操作,网上的资料挺多的,但大多数都是比较基础的,关于插入工作表(至最后一行)、删除工作表、合并/拆分单元格、设置单元格背景色、设置单元格边框色、设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)、以及设置单元格对齐方式等用法都没有怎么提到,今天就总结一下有关Qt对Excel的操作。
Qt操作Excel,无论后缀是xls还是xlsx都可以。
如下,是我下载的一个Excel VBA参考手册,内容不算太全!Excel读取为了便于测试,假设已存在一个excel文件,操作内容已经被红色标记出来。
如下所示:主要读取内容:•标题•工作表数目•工作表名称•起始行•起始列•行数•列数•单元格内容代码如下:QAxObject excel("Excel.Application");excel.setProperty("Visible", true);QAxObject *work_books = excel.querySubObject("WorkBooks");work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx"));QVariant title_value = excel.property("Caption"); //获取标题qDebug()<<QString("excel title : ")<<title_value;QAxObject *work_book = excel.querySubObject("ActiveWorkBook");QAxObject *work_sheets = work_book->querySubObject("Sheets"); //Sheets也可换用WorkSheetsint sheet_count = work_sheets->property("Count").toInt(); //获取工作表数目qDebug()<<QString("sheet count : ")<<sheet_count;for(int i=1; i<=sheet_count; i++){QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i); //Sheets(int)也可换用Worksheets(int)QString work_sheet_name = work_sheet->property("Name").toString(); //获取工作表名称QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name");qDebug()<<message<<work_sheet_name;}if(sheet_count > 0){QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);QAxObject *used_range = work_sheet->querySubObject("UsedRange");QAxObject *rows = used_range->querySubObject("Rows");QAxObject *columns = used_range->querySubObject("Columns");int row_start = used_range->property("Row").toInt(); //获取起始行int column_start = used_range->property("Column").toInt(); //获取起始列int row_count = rows->property("Count").toInt(); //获取行数int column_count = columns->property("Count").toInt(); //获取列数for(int i=row_start; i{for(int j=column_start; j{QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);QVariant cell_value = cell->property("Value"); //获取单元格内容QString message = QString("row-")+QString::number(i,10)+QString("-column-")+QString::number(j, 10)+QString(":");qDebug()<<message<<cell_value;}}}效果如下:Excel增、删、改主要操作:•设置标题•插入工作表(至最后一行)•设置工作表名称•删除工作表•设置单元格内容•设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)•设置单元格对齐方式•设置单元格高度、宽度•设置单元格背景色、边框色•合并/拆分单元格•清空单元格代码如下:QAxObject excel("Excel.Application");excel.setProperty("Visible", true);QAxObject *work_books = excel.querySubObject("WorkBooks");work_books->dynamicCall("Open(const QString&)", "E:\\test.xlsx");excel.setProperty("Caption", "Qt Excel");QAxObject *work_book = excel.querySubObject("ActiveWorkBook");QAxObject *work_sheets = work_book->querySubObject("Sheets"); //Sheets也可换用WorkSheets//删除工作表(删除第一个)QAxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);first_sheet->dynamicCall("delete");//插入工作表(插入至最后一行)int sheet_count = work_sheets->property("Count").toInt(); //获取工作表数目QAxObject *last_sheet = work_sheets->querySubObject("Item(int)", sheet_count); QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)",last_sheet->asVariant());last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant());work_sheet->setProperty("Name", "Qt Sheet"); //设置工作表名称//操作单元格(第2行第2列)QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby"); //设置单元格值cell->setProperty("RowHeight", 50); //设置单元格行高cell->setProperty("ColumnWidth", 30); //设置单元格列宽cell->setProperty("HorizontalAlignment", -4108); //左对齐(xlLeft):-4131 居中(xlCenter):-4108 右对齐(xlRight):-4152cell->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108 下对齐(xlBottom):-4107cell->setProperty("WrapText", true); //内容过多,自动换行//cell->dynamicCall("ClearContents()"); //清空单元格内容QAxObject* interior = cell->querySubObject("Interior");interior->setProperty("Color", QColor(0, 255, 0)); //设置单元格背景色(绿色)QAxObject* border = cell->querySubObject("Borders");border->setProperty("Color", QColor(0, 0, 255)); //设置单元格边框色(蓝色)QAxObject *font = cell->querySubObject("Font"); //获取单元格字体font->setProperty("Name", QStringLiteral("华文彩云")); //设置单元格字体font->setProperty("Bold", true); //设置单元格字体加粗font->setProperty("Size", 20); //设置单元格字体大小font->setProperty("Italic", true); //设置单元格字体斜体font->setProperty("Underline", 2); //设置单元格下划线font->setProperty("Color", QColor(255, 0, 0)); //设置单元格字体颜色(红色)//设置单元格内容,并合并单元格(第5行第3列-第8行第5列)QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);cell_5_6->setProperty("Value", "Java"); //设置单元格值QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5);cell_8_5->setProperty("Value", "C++");QString merge_cell;merge_cell.append(QChar(3 - 1 + 'A')); //初始列merge_cell.append(QString::number(5)); //初始行merge_cell.append(":");merge_cell.append(QChar(5 - 1 + 'A')); //终止列merge_cell.append(QString::number(8)); //终止行QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell);merge_range->setProperty("HorizontalAlignment", -4108);merge_range->setProperty("VerticalAlignment", -4108);merge_range->setProperty("WrapText", true);merge_range->setProperty("MergeCells", true); //合并单元格//merge_range->setProperty("MergeCells", false); //拆分单元格//work_book->dynamicCall("Save()"); //保存文件(为了对比test与下面的test2文件,这里不做保存操作)work_book->dynamicCall("SaveAs(const QString&)", "E:\\test2.xlsx"); //另存为另一个文件work_book->dynamicCall("Close(Boolean)", false); //关闭文件excel.dynamicCall("Quit(void)"); //退出效果如下:操作前:操作后:到这里很多人也许都在纳闷,单元格的宏怎么获取的?比如对齐方式(居中对齐),为什么值是-4108,而不是其他值呢?当然那不是我随便写的,自己可以录制宏,然后跟踪。
QT语音声卡调试教程-电脑资料
QT语音声卡调试教程-电脑资料操作教程1.先在QT进房后的界面上点击“话筒”右边的倒三角符号选择语音检测2.在声音输入选择合适的声卡,并说话如果QT显示系统成功检测到声音输入,选择下一步,。
3.在声音输出选择合适的声卡,并点击播放测试音按钮对已选播放设备进行测试如果您能听到QT播放的测试音,那么恭喜,您的扬声器是正常的,点击关闭按钮开始正常语音吧。
XP系统如果您的系统是XP系统,双击右下角系统的小喇叭,在选项那里选择属性把所有音量控制都点上把所有音量都静音,然后分别打开并听一下效果,也可以调节音量大小已知的可能造成电流声音大的原因1、驱动版本不好,有时候新版驱动未必好,装了新版驱动会有杂音,有时候装了新版驱动就没有杂音了,这都需要您自己试验;2、插孔不对。
HD声卡默认的后面板麦克风插孔是粉红色的那个,如果插在别的孔上虽然也能识别出来是麦克风,如果声卡不好就会有杂音;3、麦克风质量不好,换麦克风就知道是不是这个问题了;4、机箱后面板漏电,判断方法是把手放在机箱上看看有没有触电的感觉,放上去以后看看杂音是不是小了,电脑资料《QT语音声卡调试教程》(https://www.)。
音量控制窗口各项目的含义:主音量:声卡总音量波形:音乐音量软件合成器:软效果器插件音量Front:前置音箱音量Rear:后置音箱音量Subwoofer:环绕音箱音量Center:中置音箱音量Side:旁置音箱音量(适用于7.1音箱)SPDIF:数字接口音量控制Front green in:前面板绿色插孔输入Rear blue in:后面板蓝色插孔输入Front pink in:前面板粉色插孔输入Rear grey in:后面板灰色插孔输入Rear orange in:后面板橘红色插孔输入Rear black in:后面板黑色插孔输入Rear green in:后面板绿色插孔输入绿色插口是插耳机的粉色插孔是插麦克风的录音控制中各项目的含义:立体声混音:立体声混音(stereo mix)的含义是所有声音的混合,是电脑里发出的声音的混合。
QT中调试器的设置
QT中调试器的设置QT中调试器的设置:其实QT中安装环境最主要的就是QT的编译器和调试器的设置。
个人电脑是WIN7 的64位的系统的,装了2个QT:qt-opensource-windows-x86-msvc2010_opengl-5.3.2.exeqt-opensource-windows-x86-msvc2013_64-5.5.1.exedbg_amd64.msidbg_x86.msi所有dbg调试器,所有的需要的安装包路径为/s/1hq8nwHI - 此为百度云盘,可以在这个里面找到相对应的软件网上很多都是用VS的插件调试的,对此我也整了几天,终于弄清楚了,如下图1与图2:QT5.3.2 (32位的QT,编译出来的是32位的程序EXE,有DEBUG和RELEASE 2个版本)图1与图2:如上图所示,有2个调试器这样就可以调试程序了,但是调试出来的有如下2个程序:图3前面2个为32位的DEBUG和RELEASE程序打开DEBUG,若想要成功运行,就需要把依赖的库DLL都添加进去RELEASE中还要添加一个platforms文件夹,此文件夹放到与EXE同级目录,此文件夹的来源如下:图4其实QT中编译器调试器等可以自动检测,但是因为我电脑中装了VS2010,所以它就自动先找到的VS2010的配套编译器和调试器。
大家可以试一下后来把RELEASE生成的程序放到纯净的WIN7的32位操作系统中,可以运行成功,但是DBUG 的放进去,运行失败,失败如下图5:下面来解决这个问题:发现是所依赖的dll的版本不对,关于所依赖的库,如下图所示,找到依赖库即可。
图6在32位的时候要用32位的DEPENDS.exe。
当安装了VS2010后,在QT的调试器和编译器中总是能找到关于VS2010的调试器和编译器,下面把VS2010卸载,可看效果图。
我在虚拟机中把VS2010卸载了,现在出现如下的情况图7:说明QT本身没有带编译器调试器之类的。
qtC++调用qml实例
在declarative目录中,有个minehunt范例,实现了在C++中加载QML界面,并用C++来处理QML界面上的鼠标动作.这种思路和传统的GUI相似,感觉比较顺畅.否则运行一个QML,还要使用qmlviewer,上面带一大堆菜单按钮,看着够别扭的.在main函数中,创建了一个QDeclarativeView实例,这个实例负责显示QML界面.接着创建负责处理业务逻辑的MinehuntGame实例,并在view加载QML文件后,将其设置为引擎的上下文对象.这样就可以直接在QML中使用MinehuntGame类中的属性和方法了.感觉设置上下文后,将上下文类实例与QML界面做了融合,QML中的鼠标点击等事件就可以调用类中方法进行处理,并可以绑定到实例的属性.#include <QtGui/QApplication>#include <QtDeclarative/QDeclarativeView>#include <QtDeclarative/QDeclarativeContext>#include <QtDeclarative/QDeclarativeEngine>#include "minehunt.h"int main(int argc, char *argv[]){QApplication app(argc, argv);QDeclarativeView canvas;qmlRegisterType<TileData>();//注册TileData类,这个类不需要在QML中实例化.MinehuntGame* game = new MinehuntGame();canvas.engine()->rootContext()->setContextObject(game);canvas.setSource(QString("qrc:minehunt.qml"));QObject::connect(canvas.engine(), SIGNAL(quit()), &app, SLOT(quit())); //QML退出,应用程序也退出canvas.setGeometry(QRect(100, 100, 450, 450));canvas.show();return app.exec();}在程序中定义了代表扫雷界面中每个方块的TileData类,用来记录这个方块的状态,如做标记的,被点开的,或有雷的.那么类的实例是如何与QML进行关联同步的呢?在MinehuntGame中定义了一个属性QDeclarativeListProperty<TileData> tiles(),与_tiles成员绑定,并在类构造时向tiles中填充多个TileData实例.在QML中可以看到如下声明:Grid {anchors.horizontalCenter: parent.horizontalCentercolumns: 9; spacing: 1Repeater {id: repeatermodel: tilesdelegate: Tile {}}}这样就按MinehuntGame实例中的tiles属性进行构造Grid中的元素了,每个TileData实例生成一个Tile组件.在操作Tile组件时又会反过来调用MinehuntGame中的方法.先看看那个表情图标,点击时会重置界面.Image {anchors.bottom: field.bottom; anchors.bottomMargin: 15anchors.right: field.right; anchors.rightMargin: 20source: isPlaying ? 'MinehuntCore/pics/face-smile.png' ://isPlaying,hasWon是MinehuntGame实例中的属性,这里做了绑定,如果实例中的属性发生变化,则图标自动变化 hasWon ? 'MinehuntCore/pics/face-smile-big.png': 'MinehuntCore/pics/face-sad.png'MouseArea { anchors.fill: parent; onPressed: reset() }//点击的时候调用MinehuntGame实例的reset方法,重置雷区,上面也有个关于雷区的绑定,重置后界面自动更新}在看看点击雷区的一个方块时的动作触发过程.这里有两个成员对象,index和modelData,都是和模型绑定有关的,index表示当前选中的模型元素索引,modelData表示当前选中子模型对应的元素.在QML中可通过modelData访问TileData元素属性.下面的声明中指定,鼠标左键点击调用MinehuntGame的flip方法,右击调用flag方法.在这两个C++函数中判断是否触雷等逻辑,并修改类实例的状态,通过绑定,界面元素自动更新.MouseArea {anchors.fill: parentacceptedButtons: Qt.LeftButton | Qt.RightButtononClicked: {field.clickx = flipable.x//鼠标点击时设置主界面的clickx,clicky属性 field.clicky = flipable.yvar row = Math.floor(index / 9)var col = index - (Math.floor(index / 9) * 9)if (mouse.button == undefined || mouse.button == Qt.RightButton) { flag(row, col)} else {flip(row, col)}}onPressAndHold: {field.clickx = flipable.xfield.clicky = flipable.yvar row = Math.floor(index / 9)var col = index - (Math.floor(index / 9) * 9)flag(row, col)}}那么触雷后的例子系统是如何声明的呢?transitions: Transition {SequentialAnimation {ScriptAction {script: {var ret = Math.abs(flipable.x - field.clickx)+ Math.abs(flipable.y - field.clicky);if (modelData.hasMine && modelData.flipped)pauseDur = ret * 3elsepauseDur = ret}}PauseAnimation {duration: pauseDur}RotationAnimation { easing.type: Easing.InOutQuad }ScriptAction { script: if (modelData.hasMine && modelData.flipped) { expl.explode = true } }//这里指定如果modelData即TileData数据对象属性hasMine或flipped为true,则触发例子效果.}}expl的定义:Explosion { id: expl }.Explosion的定义:import QtQuick 1.0import bs.particles 1.0Item {property bool explode : falseParticles {//定义了一个粒子对象id: particleswidth: 40height: 40lifeSpan: 1000lifeSpanDeviation: 0source: "pics/star.png"//粒子图像count: 0angle: 270angleDeviation: 360velocity: 100velocityDeviation: 20z: 100}states: State { name: "exploding"; when: explodeStateChangeScript {script: particles.burst(200); }}}总结:要向将QML和C++结合起来,实现传统的开发方式,核心的代码就是canvas.engine()->rootContext()->setContextObject(game);这样就可以在QML中调用game实例的属性和函数了.**************测试如何在C++中获取TextInput元素中输入的内容**************根据上面的范例分析可以在QML中访问C++中定义的函数或属性,那么C++中怎么获取到QML中的界面内容呢?网上说有三种方法,一种是在C++的插件获取,一种是在C++中解析QML中的元素,最后一种是在C++中定义带参数的槽函数,在QML中的事件中调用这个槽,并将TextInput中的内容作为参数传到C++中.感觉最后一种方法最方便了,因此做了如下测试:定义QML文件:import QtQuick 1.0Rectangle{id: windowwidth: 240; height: 250BorderImage{y:0id:buttonsource:"pics/back.png"MouseArea{id:mouseAreaanchors.fill:parentonClicked:buttonClicked(textInput.text)//按钮点击的时候调用C++中的buttonClicked槽函数}Rectangle{id:shadeanchors.fill:button; radius: 10; color: "black"; opacity: 0}states:State{name:"pressed";when: mouseArea.pressed == truePropertyChanges{ target: shade; opacity: 0.4}}}BorderImage{source: "pics/back.png";width:82;height:22;y:50TextInput{id:textInputtext: qsTr("text")y:1;x:1;width:80;height:20;}}}C++类:头文件#ifndef QMLCONTROL_H#define QMLCONTROL_H#include <QObject>class QmlControl : public QObject{Q_OBJECT//必须加上Q_OBJECT宏,否则在QML中无法触发buttonClicked函数public:QmlControl(void);~QmlControl(void);public slots:Q_INVOKABLE void buttonClicked(QString textInput);};#endifcpp文件#include "QmlControl.h"#include <QMessageBox>QmlControl::QmlControl(void){setObjectName("mainObject");}QmlControl::~QmlControl(void){}void QmlControl::buttonClicked(QString textInput){QMessageBox::information(NULL, "", textInput);}界面上放一个QDeclarativeView控件,并在构造函数中加载QML,设置引擎中的对象:GetQMLInputTextValue::GetQMLInputTextValue(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags){ui.setupUi(this);qmlRegisterType<QmlControl>();QmlControl *ctrl = new QmlControl();ui.declarativeView->engine()->rootContext()->setContextObject(ctrl);ui.declarativeView->setSource(QString("qrc:/Resources/test.qml"));connect(ui.declarativeView->engine(),SIGNAL(quit()), qApp, SLOT(quit()));}注意我将QML和其中的图片放入资源中,这里引用QML的时候需要以qrc开头,否则访问不到图片文件.。