建站影视cms⽹站源码(含安装说明⽂档)
电影⽹站程序即⽤于搭建电影⽹站的建站系统,也称影视建站系统,站长下载搜集整理了⼤量优秀的电影⽹站源码,像⽐较知名的马克斯影视系统MAXCMS、飞飞影视系统PPVOD、光线影视管理系统GXCMS、天空⽹络电影系统SKYUC!等等。
⽂件:(访问密码:551685)
以下内容⽆关:
-------------------------------------------分割线---------------------------------------------
1.Qml调⽤C++类
Qt QML模块提供了⼀组API,⽤来将C++类扩展QML中。您可以编写扩展来添加⾃⼰的QML类型,扩展现有的Qt类型,或调⽤⽆法从普通QML代码访问的C/C++函数
本章将学习如何使⽤C++类编写QML扩展,其中包括属性、QML function和属性绑定等
为了⽅便⼤家理解,本章⽰例的函数实现能写在头⽂件,就写在头⽂件.
2.创建QML
将C++类扩展QML时,⼀般⽤来实现QML⽬前⽆法实现的功能,⽐如访问系统信息,⽂件信息等。
本章demo是显⽰⼀个简单的饼图,创建⼀个C++类提供给QML使⽤
这⾥导⼊⼀个"import Charts 1.0"模块,然后创建⼀个名为"PieChart"的QML类型,该类型具有两个属性:name和color。
复制代码
import QtQuick.Window 2.12
import Charts 1.0
Window {
visible: true
width: 640
height: 480
PieChart {
width: 100; height: 100
name: “A simple pie chart”
color: “red”
}
}
复制代码
要做到这⼀点,我们需要⼀个C++类,它封装了这个PieChart类型及其name和color两个属性。
3.创建C++类
由于QML⼤量使⽤了Qt的元对象系统,因此该类必须是:
继承于QObject的派⽣类
并且有Q_OBJECT宏
以下是我们的饼图PieChart类,在piechart.h中定义:
复制代码
#include <QtQuick/QQuickPaintedItem>
#include
#include
#include
#include
#include
class PieChart : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QColor color READ color WRITE setColor)
public:
PieChart(QQuickItem *parent = 0);
QString name() const { return m_name; }
void setName(const QString &name) { m_name = name; }
QColor color() const { return m_color; }
void setColor(const QColor &color) { m_color = color; }
void paint(QPainter *painter);
private:
QString m_name;
QColor m_color;
public slots:
void onTimeout();
};
复制代码
请注意,尽管color在QML中指定为字符串.⽐如"#00FF00",但它会⾃动转换为QColor对象,像“640x480”这样的字符串可以⾃动转换为QSize值。
该类继承⾃QQuickPaintedItem,因为我们希望在使⽤QPainter API执⾏绘图操作时重写QQuickPaintedItem::paint()。
如果类只是表⽰了某些数据类型,⽽不是实际需要显⽰的内容,它可以简单地从QObject继承。
如果我们想创建⼀个不需要使⽤QPainter API执⾏绘图操作的可视化项,我们可以只对QQuickItem⼦
类进⾏⼦类。
Ps:
QQuickItem: Qt Quick中的所有可视项都继承⾃QQuickItem。虽然QQuickItem没有视觉外观,但它定义了视觉项⽬中常见的所有属性,如x和y位置、宽度和⾼度、锚定和Key处理⽀持。
QQuickPaintedItem:继承⾃QQuickItem,并扩展了Qt中的QPainter API函数,使得QPainter将能够直接绘制到QML场景的纹理上。调⽤update()时可以重新绘制。在paint()中使⽤setAntaliasing()时可以设置抗锯齿渲染
PieChart类使⽤Q_PROPERTY宏定义了两个属性name和color,并重写QQuickPaintedItem::paint()。
3.1 Q_PROPERTY介绍
Q_PROPERTY 宏定义属性的⼀些主要关键字的意义如下:
READ 指定⼀个读取属性值的函数,没有 MEMBER 关键字时必须设置 READ。
WRITE 指定⼀个设定属性值的函数,只读属性没有 WRITE 设置。
MEMBER 指定⼀个成员变量与属性关联,成为可读可写的属性,⽆需再设置 READ 和 WRITE。
RESET 是可选的,⽤于指定⼀个设置属性缺省值的函数。
NOTIFY 是可选的,⽤于设置⼀个信号,当属性值变化时发射此信号(在QML中经常⽤到,⽐如onXChanged)。
DESIGNABLE 表⽰属性是否在 Qt Designer ⾥可见,缺省为 true。
CONSTANT 表⽰属性值是⼀个常数,对于⼀个对象实例,READ 指定的函数返回值是常数,但是每个实例的返回值可以不⼀样。具有CONSTANT 关键字的属性不能有 WRITE 和 NOTIFY 关键字。
FINAL 表⽰所定义的属性不能被⼦类重载。
在C++中属性的使⽤
不管是否⽤ READ 和 WRITE 定义了接⼝函数,只要知道属性名称,就可以通过 QObject::property() 读取属性值,并通过QObject::setProperty() 设置属性值。
⽐如定义⼀个类:
复制代码
class MyObj : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
public:
MyObj(QQuickItem *parent = 0) { }
QString name() const { return m_name; }
void setName(const QString &name) { qDebug()<<name; m_name = name; } // 添加了⼀个打印
private:
QString m_name; // ⽤来保存name属性的值
};
复制代码
然后我们调⽤setProperty时:
MyObj ct;
ct.setProperty(“name”,“1234”); // 将会调⽤setName()接⼝函数,并且打印"1234"
图片下载站源码在QML中属性的使⽤(在"5.属性绑定"会讲解)
在QML中,属性就更加常见了,⽐如Rectangle的color属性,其实本质就是:
复制代码
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
public:
QColor color() const { return m_color; }
void setColor(const QColor &color) { if (color == m_color) return; m_color = color; emit colorChanged(); } signals:
void xChanged(const QString &name);
private:
QColor m_color;
复制代码
假如在c++类中⾃⼰更改属性时,并且该属性设置了NOTIFY关键字,那么必须更改后,主动emit来触发属性更改信号,⽐如:
m_color = QColor::QColor(255, 0, 0, 255);
emit colorChanged();
3.2 piechart.cpp最终如下所⽰:
复制代码
#include “piechart.h”
PieChart::PieChart(QQuickItem *parent)
QQuickPaintedItem(parent)
{
}
void PieChart::paint(QPainter *painter)
{
QPen pen(m_color, 2);
painter->setPen(pen);
painter->setRenderHints(QPainter::Antialiasing, true);
painter->drawPie(boundingRect().adjusted(1, 1, -1, -1), 90 * 16, 290 * 16);
}
复制代码
4.在main.cpp中通过qmlRegisterXXX注册C++类到QML中
我们已经创建好了C++类,剩下的就是注册到QML中即可⼤功告成了.注册函数是qmlRegisterType(),当然也可以通过qmlRegisterSingletonType()注册单例类(后⾯章节介绍).
qmlRegisterType函数模版声明如下:
template
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
// uri: 类似于java包名,⽐如"import QtQuick 2.12","QtQuick"就是包名,⽽2.12是versionMajor和versionMinor拼接的版本号// qmlName: 包名中的类型名称,⽐如Rectangle就是QtQuick包名中的其中⼀个类型名称
main函数如下所⽰:
复制代码
#include
#include
#include “piechart.h”
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<PieChart>("Charts", 1, 0, "PieChart"); // 注册C++类
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
();
}
复制代码
运⾏效果如下所⽰:
5.属性绑定
属性绑定是QML的⼀个强⼤功能,它允许⾃动同步不同类型的值。当属性值更改时,它使⽤信号通知和更新其他类型的值。
我们来创建两个PieChart图,名称分别为chartA和chartB,然后我们在chartB⾥进⾏color属性绑定"color: lor".
修改main.qml:
复制代码
import QtQuick 2.14
import QtQuick.Window 2.12
import Charts 1.0
Window {
visible: true
width: 640
height: 480
Row {
PieChart {
id: chartA
width: 100; height: 100
name: "A simple pie chart"
color: "red"
}
PieChart {
id: chartB
width: 100; height: 100
name: "A simple pie chart"
color: lor
}
}
MouseArea {
anchors.fill: parent
onClicked: { lor = "blue" }
}
}
复制代码
修改piechart.h:
复制代码
#include <QtQuick/QQuickPaintedItem>
#include
#include
#include
#include
#include
class PieChart : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
public:
PieChart(QQuickItem *parent = 0);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论