我发现了几个与此主题相关的类似问题,但尚未将可行的解决方案拼凑在一起。我有非矩形Qt快速图像,每个都有一个孩子MouseArea。当前的onClicked事件在透明区域中记录父Image的点击,我想忽略。有没有QML专用的解决方案吗?是否可以建议仅限QML的解决方案,还是应该在c ++中完成透明度确定?
main.qml文件中的伪代码:
Image {
id: testImage
x: 200
y: 100
width: 100
height: 150
fillMode: Image.PreserveAspectFit
source: "TestImage.svg"
MouseArea {
id: testMouseArea
anchors.fill: parent
onClicked: {
//if alpha of (mouseX, mouseY) > 0 {
//DO STUFF
//}
}
}
}
我的理解是getImageData()不能用于此目的,因此可能无法直接在QML中的(mouseX,mouseY)坐标处确定父图像的alpha级别。
答案 0 :(得分:1)
您可以在C ++中使用QImage
来启用查询像素的颜色。
一个简短的,非常不完整的解决方案(只是为了支出这个想法)就是这样:
* // MyMask.h
#ifndef MYMASK_H
#define MYMASK_H
#include <QObject>
#include <QImage>
#include <QString>
class MyMask : public QObject, public QImage
{
Q_OBJECT
Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)
public:
explicit MyMask(QObject *parent = nullptr);
QString source() const;
void setSource(const QString &source);
signals:
void sourceChanged();
public slots:
QColor color(int x, int y);
private:
QString m_source;
};
#endif // MYMASK_H
// MyMask.cpp
#include "mymask.h"
#include <QRgb>
#include <QColor>
#include <QDebug>
MyMask::MyMask(QObject *parent)
: QObject(parent),
QImage()
{
QObject::connect(this, &MyMask::sourceChanged, this, [this]() { QImage::load(m_source); });
}
QColor MyMask::color(int x, int y)
{
return QImage::pixelColor(x, y);
}
QString MyMask::source() const
{
return m_source;
}
void MyMask::setSource(const QString &source)
{
if (source != m_source) {
m_source = source;
emit sourceChanged();
}
}
使用QImage
作为成员而不是基类可能更明智但我从QImage
开始,直到我意识到它不是QObject。
如前所述,这不是完整的实施。例如,不可能调整大小,例如伸展它。此外,您无法将Item
作为来源,依此类推。无论是否加载都无法控制......但也许这可以作为一个开始。
您甚至可以将EventFilter
作为Item
安装到可以点击的MouseEvent
,直接过滤SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 1), ',', -1) AS Lookup_1
, SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 2), ',', -1) AS Lookup_2
, SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 3), ',', -1) AS Lookup_3
, SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 4), ',', -1) AS Lookup_4
, SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 5), ',', -1) AS Lookup_5
FROM
[table]
以获取相关性。