Изменить атрибут класса c ++ из текстового ввода QML - PullRequest
0 голосов
/ 22 апреля 2020

Хорошо, поэтому название говорит именно то, что я пытаюсь сделать. Я покажу вам код и проблему, которая у меня есть.

Что я хочу сделать


Я пытаюсь открыть файл одним щелчком мыши на кнопку с пользовательским именем файла, введенным в textInput. Это textInput обрабатывается через мой AntennaFile класс. Открытие файла происходит в функции openButtonClicked.

У меня проблема


Мой m_fileName атрибут не имеет значения в * Функция 1020 *, даже если она есть в setFileName (я проверил отладку с точками останова и с qDebug()).

Так как же заставить атрибут не «потерять» его значение? Я, безусловно, упускаю что-то очень простое и важное, чтобы все это работало, и это сводит меня с ума.

Итак, вот весь необходимый код (я думаю?), Чтобы вы могли точно увидеть, что я сделал.

антенный файл. cpp

#include "antennafile.h"

AntennaFile::AntennaFile(QObject *parent) : QObject(parent)
{
}

QString AntennaFile::getFileName()
{
    return m_fileName;
}

void AntennaFile::setFileName(const QString &fileName)
{
    if (fileName != m_fileName)
    {
        m_fileName = fileName;
        emit fileNameChanged();
        qDebug() << m_fileName; // Here, m_fileName has the value of what I typed in the textInput
    }
}

void AntennaFile::processFile(QString fileName, QVector<QString> &vecOfStrs)
{
    // Code removed for smaller post
}

void AntennaFile::openButtonClicked()
{
    QVector<QString> vecOfStrs;
    QString nameOfFile = "../QMLStageProject/AntennaTypes/";
    nameOfFile.append(m_fileName);
    qDebug() << nameOfFile; // Here, m_fileName is empty, hence, nothing is changed to nameOfFile

    processFile(nameOfFile, vecOfStrs);
}

антенный файл.h

#ifndef AntennaFile_H
#define AntennaFile_H

#include "framework.h"
#include "antennadata.h"

class AntennaFile : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString fileName READ getFileName WRITE setFileName NOTIFY fileNameChanged)

public:
    explicit AntennaFile(QObject *parent = 0);
    QString getFileName();
    void setFileName(const QString &fileName);

private:
    void processFile(QString fileName, QVector<QString> & vecOfStrs);

public slots:
    void  openButtonClicked();

signals:
    void fileNameChanged();

private:
    QString m_fileName;
};

#endif // AntennaFile_H

основной. cpp

#include "framework.h"
#include "antennafile.h"
#include "antennatablemodel.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    const QUrl url(QStringLiteral("qrc:/main.qml"));

    AntennaFile antennaFile;
    engine.rootContext()->setContextProperty("_AntennaFile", &antennaFile);

    // Registers
    qmlRegisterType<AntennaFile>("AntennaFile", 1, 0, "AntennaFile");
    qmlRegisterType<AntennaTableModel>("AntennaTableModel", 1, 0, "AntennaTableModel"); // An other class

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

main.qml - опять не весь код, только то, что нужно

import QtQuick 2.12
import QtQuick 2.6
import QtQuick.Window 2.12
import QtQuick.Controls 1.4
import QtQuick.Controls 2.0
import QtQuick.Controls 2.14
import QtCharts 2.3

import AntennaFile 1.0;
import AntennaTableModel 1.0;

Window
{
    id: window
    visible: true
    width: 950
    height: 680
    title: qsTr("QML Stage Project")

    AntennaFile {
        id: antennafile
    }

    TextInput {
        id: antennaTextInput
        x: 92
        y: 14
        width: 351
        height: 20
        text: antennafile.fileName
        font.pixelSize: 17
        onTextChanged: antennafile.fileName = text
    }

    Button {
        id: openButton
        x: 363
        y: 0
        width: 170
        height: 31
        text: qsTr("Open")
        font.pixelSize: 15
        onClicked: _AntennaFile.openButtonClicked();
    }
}

1 Ответ

1 голос
/ 22 апреля 2020

у вас есть два экземпляра AntennaFile! Первый как свойство контекста. Второй в вашем main.qml. Вы не используете тот же самый для редактирования текста и кнопки! Изменение вашего кода, как это, должно работать:

import QtQuick 2.12
import QtQuick 2.6
import QtQuick.Window 2.12
import QtQuick.Controls 1.4
import QtQuick.Controls 2.0
import QtQuick.Controls 2.14
import QtCharts 2.3

import AntennaFile 1.0;
import AntennaTableModel 1.0;

Window
{
    id: window
    visible: true
    width: 950
    height: 680
    title: qsTr("QML Stage Project")

    AntennaFile {
        id: antennafile
    }

    TextInput {
        id: antennaTextInput
        x: 92
        y: 14
        width: 351
        height: 20
        text: antennafile.fileName
        font.pixelSize: 17
        onTextChanged: antennafile.fileName = text
    }

    Button {
        id: openButton
        x: 363
        y: 0
        width: 170
        height: 31
        text: qsTr("Open")
        font.pixelSize: 15
        onClicked: antennafile.openButtonClicked();
    }
}

Вы можете фактически удалить эти строки из своей основной:

AntennaFile antennaFile;
engine.rootContext()->setContextProperty("_AntennaFile", &antennaFile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...