如何Rectangle在QtQuick 2.0上为可视项目绘制阴影?
我喜欢为我的主窗口画一个阴影(我有一个透明且没有装饰的窗口)
我已经看到在QML中有一个Bezier曲线的示例实现,但我正在寻找一个如何实现虚线或点状贝塞尔曲线的提示.据我所知,Bezier曲线示例的作者QSGGeometryNode用于存储内部,QSGGeometry并QSGFlatColorMaterial在其上应用了材料.然后,他们只需创建点列表并在它们之间绘制段.
是否有可能写一个shader,并把它应用到QSGFlatColorMaterial(以显示线dashed,dotted等等)?
最终,是否可以存储多个QSGGeometry内部QSGGeometryNode?
UPDATE
我想在"纯QtQuick"中实现它- 而不是在"旧"接口(例如QPainter etc)中 - 因为我不想使用切换上下文(openGL和CPU)的东西.我更喜欢使用自定义着色器的解决方案(如果它可行) - 因为我将有更多的可能性来实现自定义外观(虚线,溺爱,彩色,可能是动画等).
如果不可能,我会用QPainter.
我正在寻找QML代码的编码风格检查器.像Checkstyle或艺术风格的东西.人们使用什么来为他们选择的DSL定义编码样式检查?
澄清:我正在寻找可用于构建自动化而非GUI工具的东西.
这是一个可重复的例子:
main.qml
import QtQuick 2.0
Item {
id : root
width: 360
height: 360
Text {
id : t1
text: qsTr("Hello World")
property int someNumber: 1000
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
Qt.quit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include <QtGui/QGuiApplication>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QQmlProperty>
#include <QDebug>
#include "qtquick2applicationviewer.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/untitled/main.qml"));
viewer.showExpanded();
QQmlEngine engine;
QQmlComponent component(&engine, "qml/untitled/main.qml");
QObject *object = component.create();
qDebug() << "Property value:" << QQmlProperty::read(object, …Run Code Online (Sandbox Code Playgroud) FileDialog给出一个QML url变量.theurl.toString()给出类似的东西file:///c:\foo\bar.txt.我怎么得到c:\foo\bar.txt?
我想以跨平台的方式做到这一点,理想情况下不依赖于正则表达式的黑客攻击.QUrl提供了一种path()方法,但我似乎无法从QML访问它.
我有以下问题.
我正在开发一个C++模型和一个Qml视图,通过控制器连接它们.在我的模型中,我执行多次计算.我还为我的应用程序的用户提供了编写自定义事件处理程序的可能性,用qml编写.现在我遇到了一个问题,我决定使用固定点表示法,并编写了相应的C++类.现在我想向开发人员提供FixedPoint类 - 包括其所有运算符 - 他们决定在Qml中扩展我的应用程序.到目前为止,我提供了所有数据作为QProperties,这是编码指南所要求的.但我愿意接受其他解决方案,以便在我的团队中讨论它们.显然,固定点不是标识,算法依赖于复制它的可能性,这在继承QObject时是不允许的.
所以问题到了:我怎样才能将c ++类/结构体暴露给QML,这不是一个身份?
代码中的一个例子:
struct FixedPoint
{
FixedPoint(FixedPoint&);
FixedPoint& operator=(FixedPoint&);
...
int mantissa;
int exponent;
}
Run Code Online (Sandbox Code Playgroud)
我想在Qml中使用它作为用C++编写的QQuickItem的属性(值):
MyQmlObject{
value{ mantissa: 134; exponent: 3 }
}
Run Code Online (Sandbox Code Playgroud)
然后在javascript中的整个计算中使用属性值,并将其复制多次.所以我认为我不能将值设为FixedPoint*类型的属性.我对吗?
我有一个基于Qt5.4的程序和一些图像处理.我使用QCameramy videoSurface(派生自QAbstractVideoSurface)来获取VideoFrames.它在Windows上运行良好.
但现在我需要我的应用程序的Android版本.我发现QCamera在Android上不起作用.但我看到QML Camera示例在Android上运行没有任何问题.
所以我决定用QML重写我的应用程序.主要问题:我无法在C++中访问QML Camera表面.
void myVideoOutput::setSource(QObject *source)
{
qDebug() << Q_FUNC_INFO << source;
if (source == m_source.data())
return;
m_source = source;
if (m_source) {
const QMetaObject *metaObject = m_source.data()->metaObject();
QStringList properties;
for(int i = metaObject->propertyOffset(); i < metaObject >propertyCount(); ++i)
properties << QString::fromLatin1(metaObject->property(i).name());
qDebug() << properties;
}
.....
emit sourceChanged();
}
Run Code Online (Sandbox Code Playgroud)
此代码提供对属性的访问.但我无法以这种方式访问videoSurface(使用QCamera我可以做到).我想知道QML Camera是如何工作的?它是基于QCamera?我看QCamera *m_camera在QDeclarativeCamera...
所以我有两个问题:
我的问题是如何在qml中定义枚举器?或者我们可以在qml中用c ++定义一个对象相同的枚举?对象枚举如下面的源代码,我想在qt中执行此操作而不是在Qt中使用javascript,我该怎么办?谢谢你的答复,
enum Color { RED, GREEN, BLUE };
Color r = RED;
switch(r)
{
case RED : std::cout << "red\n"; break;
case GREEN: std::cout << "green\n"; break;
case BLUE : std::cout << "blue\n"; break;
}
Run Code Online (Sandbox Code Playgroud)
我想知道Qml有能力定义枚举吗?谢谢你的答复
我的Window项目中有一个子类,在运行时,实例创建并完全在QML端显示.我知道我可以阻止窗口由不包括被最小化WindowMinimizeButtonHint的flags:,但我确实需要有最小化按钮存在并启用,但能够拦截的最小化按钮点击,取消实际的最小化,并做其他事(仅供参考我的客户要求这种非标准的窗口行为,而不是我.
到目前为止,我已经能够达到的唯一的事情是处理onWindowStateChanged:事件,检查windowState === Qt.WindowStateMinimized并呼吁show()从一个计时器(它调用的事件处理程序内直接什么都不做).这导致窗口向下移动到系统托盘,然后突然恢复正常.
有没有办法做到这一点,比如OnMinimized可以取消的事件?
编辑:根据Benjamin T的回答,我至少是OSX解决方案的一部分:
#import <AppKit/AppKit.h>
bool NativeFilter::nativeEventFilter(const QByteArray &eventType,
void *message, long *result)
{
if (eventType == "mac_generic_NSEvent") {
NSEvent *event = static_cast<NSEvent *>(message);
if ([event type] == NSKeyDown) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我能够拦截并取消所有NSKeyDown事件(同时留下其他事件,如鼠标点击等仍在工作).剩下的问题是我仍然不知道拦截一个最小化事件 - NSEvent.h似乎没有任何涵盖它的东西.也许我需要演绎不同类型的活动?
编辑2 - 工作解决方案:
我无法找到任何方法来截取最小化事件并取消它,所以我的解决方法是拦截窗口上的点击,确定点击是否超过最小化按钮(或关闭或缩放按钮)并取消如果是这样的事件(并向我的qml窗口发送通知,表示发生了点击).我还处理双击标题栏以缩放窗口,并使用Command-M键最小化窗口的情况.
第一步是实施一个QAbstractNativeEventFilter.在你的标题中:
#include <QAbstractNativeEventFilter>
class NativeFilter : public QAbstractNativeEventFilter {
public:
bool nativeEventFilter(const QByteArray &eventType, void …Run Code Online (Sandbox Code Playgroud) 我的应用程序具有创建并打开一个QML的子类的实例的主窗口Window {}使用createObject().这个窗口flags:设置为无边框窗口(我添加了代码,以便可以抓取并拖动它).
当我将显示器连接到笔记本电脑并将其字体比例因子设置为125%(或150%)时,当我将主窗口拖到第二个显示器时,您可以看到它突然"突然"到更大的尺寸中途点.同样地,当我将它拖回到我的笔记本电脑屏幕时,当我半途而废时,它再次"捕捉"到较小的尺寸(这种行为是我想要的,所以这里没有问题).
我的问题是,当我将创建的无边框窗口拖到显示器中时,它保持原始的100%比例因子,并且不会"捕捉"到更大的尺寸.如果我将主窗口拖到显示器上,它会变大,但无边框窗口保持较小的比例; 只有当我抓住无边框窗口并稍微移动它才会突然"捕捉"到更大的比例尺寸.相反的情况反过来 - 如果我然后将无边框窗口拖回到笔记本电脑上,它将保持较大的尺寸,直到我将主窗口向后拖动然后稍微移动无边框窗口(此时它突然"捕捉"到较小的尺寸).
所以看来这个创建Window使用了屏幕的比例因子父窗口 创建它的窗口当前处于,即使它本身位于不同的屏幕中.
这是否因为Window无边界而发生?(我即将测试这个,但我的构建过程非常慢)或者有没有办法设置这个无边框Window,以便它检测到它正在进入一个新的屏幕并重新缩放自己(就像我的方式一样)主窗口呢)?
更新:我刚刚运行了一个测试,给出了我Window的原生标题栏,并且使用标题栏,窗口立即采用("快照")任何一个屏幕的比例因子,就像我的主窗口一样(并且独立于主窗口)窗口的比例因子).
那么有没有办法用无边框窗口复制这种自动缩放窗口行为?我需要调用一些标志,或者我需要调用一些方法来让操作系统重新调整窗口大小?
更新2:我尝试了Felix的SetWindowPos解决方案.它确实会移动窗口,但这并不能解决缩放问题 - 无框窗口的行为是相同的,它仍然无法正确地获取它所在屏幕的缩放因子.
我正在运行测试,MoveWindow而不是SetWindowPos看看是否会影响任何事情[ 编辑: MoveWindow不起作用,或者 - 同样的问题].然后我将尝试SendMessage或PostMessage与NoBugz一起提出WM_DPICHANGED消息的建议.
欢迎任何其他建议.
更新3:我刚刚创建了一个快速的C#应用程序(winforms)来查看是否出现了同样的问题,而且它没有 - 当C#应用程序中的无边框表单被拖到另一个监视器中时,它会立即获取比例因子变化.所以看来这是一个Qt问题.
更新4:请参阅下面的答案,找出解决此问题的方法(如果有点破解).