연결 기능은 아래와 같 C++slot

0

질문

나는 응용 프로그램을 만든 로 자동화된 스크린 샷을 각 시간의 소스 로더는 변화! 내가 하려고 연결하는 유저 신호(스크린샷())을 CPP 슬롯(take_screenshot()). 그러나,take_screenshot()함수는 결코 불만의 소스 로더 등급이 없는 변경하고 나는 받는 콘솔 로그인뿐만 아니라! 여기에 내 cpp.h

 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;
};

그리고 여기 나습니다.프로그램입니다..

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

액세스하지 않습 프로그램입니다..체에서는 C++를 얻을 수 있으므로 예상치 못한 행동을 합니다. 이 경우에는 그것이 나를 내보내는 개체의 프로그램입니다..예를 들어,만하는 단일:

utils.h

#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();
}

습니다.프로그램입니다..

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

@저먼 필. 감사
eyllanesc

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................