Повторное использование виджетов qt C++ в qml
Я планирую создать приложение с QML. Я реализовал много виджетов Qt в C++. Виджеты C++ должны использоваться в QML.
Как их интегрировать? путь к dll - существует ли какой-нибудь qml-контейнер?
Я не нашел хорошую документацию для этой проблемы
1 ответ
Это возможно, но не представляется возможным, если только рассматриваемые виджеты не содержат много графики (вероятно, если у вас есть класс, основанный на QGraphivsView). Если виджеты, на которые вы ссылаетесь, являются "обычными" QWidgets, пожалуйста, не пытайтесь делать это, потому что это больше проблем, чем стоит.
Вам нужно создать новый класс, который наследует QQuickPaintedItem, и переопределить несколько методов:
Заголовок:
class QQmlWidget : public QQuickPaintedItem
{
Q_OBJECT
public:
explicit QMLProfile(QWidget *internalWidget, QQuickItem *parent = 0) : QQuickPaintedItem(parent), internalWidget(internalWidget){}
virtual ~QMLProfile();
void paint(QPainter *painter) override;
protected:
void mouseMoveEvent(QMouseEvent *event);
private:
QWidget *internalWidget;
};
Cpp: (приведенный ниже код взят из подповерхностного кода, который использует QGraphivsView на QML)
void paint(QPainter* painter) {
// let's look at the intended size of the content and scale our scene accordingly
QRect painterRect = painter->viewport();
QRect profileRect = internalWidget->viewport()->rect();
qreal sceneSize = 104; // that should give us 2% margin all around (100x100 scene)
qreal dprComp = devicePixelRatio() * painterRect.width() / profileRect.width();
qreal sx = painterRect.width() / sceneSize / dprComp;
qreal sy = painterRect.height() / sceneSize / dprComp;
// next figure out the weird magic by which we need to shift the painter so the widget is shown
int dpr = rint(devicePixelRatio());
qreal magicShiftFactor = (dpr == 2 ? 0.25 : (dpr == 3 ? 0.33 : 0.0));
// now set up the transformations scale the profile and
// shift the painter (taking its existing transformation into account)
QTransform profileTransform = QTransform();
profileTransform.scale(sx, sy);
QTransform painterTransform = painter->transform();
painterTransform.translate(-painterRect.width() * magicShiftFactor ,-painterRect.height() * magicShiftFactor);
// apply the transformation
painter->setTransform(painterTransform);
internalWidget->setTransform(profileTransform);
// finally, render the profile
internalWidget->render(painter);
}
QQmlWidget::mouseMoveEvent(QMouseEvent *ev){
/* Map the eveent to the Widget */
QQuickPaintedItem(ev);
internalWidget->mouseEvent(ev);
}
Как я уже сказал, выполнимо, но не совсем прямолинейно. Делайте это, только если у вас нет возможности воссоздать виджеты в QML.