Добрый вечер.
У Qt как обычно - то понос, то золотуха.
Итак, есть класс:
C++ (Qt)
#ifndef LOGGER_H
#define LOGGER_H
#include <QObject>
#include <QFile>
#include <QSqlError>
class Logger : public QObject
{
Q_OBJECT
public:
enum StatusFlag
{
Success = 0,
Failure = 1,
Warning = 2,
Info = 3
};
Q_DECLARE_FLAGS(Status, StatusFlag)
explicit Logger(const QString &label) : QObject(0), _label(label), _filename("log.txt"), _errors(0) { this->_initialize(); }
explicit Logger(Logger *logger) : QObject(0), _label(logger->_label), _log(logger->_log), _filename(logger->_filename), _errors(logger->_errors) { this->_initialize(); }
~Logger() {}
inline bool hasErrors() const { return this->_errors > 0; }
inline int errorsCount() const { return this->_errors; }
inline void clearLog() { QFile::remove(this->_filename); }
inline const QString& label() const { return this->_label; }
inline void logOnce(const QString &text) { this->log(text); this->save(); }
inline void logDb(const QString &text, const QSqlError &error) { this->log(text + "\nОшибка " + error.nativeErrorCode() + ": " + error.databaseText()); }
inline void logDbOnce(const QString &text, const QSqlError &error) { this->logDb(text, error); this->save(); }
void log(const QString &text);
void save();
inline void showMessage(Status status, const QString &text) { emit operationFinished(status, text); }
private:
QString _label, _log, _filename;
int _errors;
void _initialize();
signals:
void operationFinished(Status status, const QString &text);
};
#endif // LOGGER_H
C++ (Qt)
#include "Logger.h"
#include "MainWindow.h"
#include <QTextStream>
#include <QDateTime>
void Logger::log(const QString &text)
{
this->_errors++;
this->_log.append(text + "\n");
}
void Logger::save()
{
QFile file(this->_filename);
if(!file.open(QIODevice::Append | QIODevice::Text)) return;
QTextStream out(&file);
out << "[" << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << "] -----" << this->_label << "----- (" << QString::fromUtf8("ошибок: ") << this->_errors << ")\n\n" << this->_log << '\n' << endl;
file.close();
this->_log.clear();
this->_errors = 0;
}
void Logger::_initialize()
{
MainWindow *window = qobject_cast<MainWindow*>(qApp->activeWindow());
if(window != NULL) this->connect(this, &Logger::operationFinished, window, &MainWindow::showStatusBarMessage); // че ему тут не так?
}
Скопировал как есть.
Если убрать строку:
C++ (Qt)
if(window != NULL) this->connect(this, &Logger::operationFinished, window, &MainWindow::showStatusBarMessage);
то все собирается и запускается.
Вопрос: что ему тут не так?
1. Наследование от QOBJECT - есть
2. Q_OBJECT - есть
3. Удалял файлы, заново их создавал и копировал в них код - бестолку
4. Числил, qmake, пересобирал - бестолку