Хорошо, поэтому название говорит именно то, что я пытаюсь сделать. Я покажу вам код и проблему, которая у меня есть.
Что я хочу сделать
Я пытаюсь открыть файл одним щелчком мыши на кнопку с пользовательским именем файла, введенным в 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();
}
}