जोड़ने QML करने के लिए C++ स्लॉट

0

सवाल

मैं बनाया एक आवेदन पत्र लेने के स्वचालित screenshots प्रत्येक समय के स्रोत के एक लोडर में बदल रहा है! मैं कोशिश कर रहा हूँ करने के लिए कनेक्ट QML संकेत (स्क्रीनशॉट()) के लिए एक सीपीपी स्लॉट (take_screenshot()). हालांकि, take_screenshot() समारोह में बुलाया गया कभी नहीं किया है, हालांकि के स्रोत लोडर beeing है बदल गया है और मैं कर रहा हूँ प्राप्त करने के कंसोल लॉग इन के रूप में अच्छी तरह से! यहाँ है मेरे सीपीपी.ज

 class MyClass : public QObject
 {
    Q_OBJECT
public:
MyClass(std::shared_ptr<QQmlApplicationEngine> engin)
    : m_engine(engin)
{
    QObject* root = m_engine->rootObjects()[0];
    Q_ASSERT(root != nullptr);
    QObject::connect(root, SIGNAL(screenshot()),
                     this, SLOT(take_screenshot()));
}

public slots:
int take_screenshot()
{
        QString currentDateTime = QDateTime::currentDateTime().toString( "MMMM d, yyyy, HH:mm:ss");
        QScreen *screen;
        QPixmap pixmap;
        screen = QGuiApplication::primaryScreen();
        pixmap = screen->grabWindow(0);
        QString screenshotPath = QDir::currentPath();
        QString screenShotFileName = QString("%1/%2.png").arg(screenshotPath).arg(currentDateTime);

        if (!screenShotFileName.isEmpty())
        {
            pixmap.save(screenShotFileName);
            return 1;
        }
        else
            return 0;
}

private:
std::shared_ptr<QQmlApplicationEngine> m_engine;
};

और यहाँ मेरे मुख्य.qml

Window {
id: mainWindow
visible: true
width: 640
height: 480
title: qsTr("Hello World")

signal screenshot()
Loader {
         id: pageLoader
         objectName: "pageLoader"
         anchors.fill: parent
         onSourceChanged: {
         console.log("onSourceChanged_source :", pageLoader.source)
                mainWindow.screenshot()
            }
         Component.onCompleted:{
                console.log("onCompleted!", pageLoader.source)
                mainWindow.screenshot()
            }
        }
   }

किसी भी विचारों के बारे में इस मुद्दे सहायक हो सकते हैं! अग्रिम में धन्यवाद!

c++ qml qt signals-slots
2021-10-26 21:11:59
1

सबसे अच्छा जवाब

1

का उपयोग नहीं करते QML वस्तुओं में सी++ के रूप में आप अप्रत्याशित हो सकता है व्यवहार. इस मामले में यह बेहतर है करने के लिए निर्यात के लिए वस्तु QML उदाहरण के लिए, बनाने के लिए एक सिंगलटन:

utils.ज

#ifndef UTILS_H
#define UTILS_H

#include <QGuiApplication>
#include <QObject>
#include <QPixmap>
#include <QQmlApplicationEngine>
#include <QScreen>
#include <QDateTime>
#include <QDir>

class Utils : public QObject
{
    Q_OBJECT
public:
    using QObject::QObject;
public slots:
    bool screenshot(){
        qDebug() << __PRETTY_FUNCTION__;
        QString currentDateTime = QDateTime::currentDateTime().toString( "MMMM d, yyyy, HH:mm:ss");
        QString screenshotPath = QDir::currentPath();
        QString filename = QString("%1/%2.png").arg(screenshotPath).arg(currentDateTime);
        if(QScreen *screen = QGuiApplication::primaryScreen()){
            QPixmap pixmap = screen->grabWindow(0);
            return pixmap.save(filename));
        }
        return false;
    }
};
#endif // UTILS_H

main.cpp

#include "utils.h"

#include <QGuiApplication>
#include <QQmlApplicationEngine>


int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    QScopedPointer<Utils> utils(new Utils);
    qmlRegisterSingletonInstance("Utils", 1, 0, "Utils", utils.get());

    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);
    return app.exec();
}

मुख्य.qml

import QtQuick 2.15
import QtQuick.Window 2.15

import Utils 1.0

Window {
    id: mainWindow
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Loader {
        id: pageLoader
        anchors.fill: parent
        onSourceChanged: {
            console.log("onSourceChanged_source :", pageLoader.source)
            Utils.screenshot()
        }
        Component.onCompleted:{
            console.log("onCompleted!", pageLoader.source)
            var res = Utils.screenshot()
            console.log(res)
        }
    }
}
2021-10-26 22:20:34

यह अभी भी बुला mainWindow.screenshot(). मुझे लगता है कि आप का इरादा बदलने के लिए है कि करने के लिए Utils.screenshot(), सही?
JarMan

@कल ooops. धन्यवाद
eyllanesc

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में