Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: phpCoder от Январь 16, 2015, 19:04



Название: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: phpCoder от Январь 16, 2015, 19:04
Добрый вечер.
У 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, пересобирал - бестолку



Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: kuzulis от Январь 16, 2015, 19:28
Цитировать
У Qt как обычно - то понос, то золотуха.

[fixed]У phpCoder как обычно - то понос, то золотуха.[/fixed]


Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: torwig от Январь 16, 2015, 19:58
Почему не просто
Код:
connect(this, &Logger::operationFinished, window, &MainWindow::showStatusBarMessage);
Может передавайте в сигнале text по значению?
Или напишите коннект в "старом стиле":
Код:
connect(this, SIGNAL(operationFinished(Logger::Status status, const QString &text)), 
           window, SLOT(showStatusBarMessage(Logger::Status status, const QString &text));


Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: kambala от Январь 16, 2015, 20:40
какой секретный смысл в том, чтобы пускать сигнал из себя известному объекту? можно же просто напрямую вызвать слот-метод у объекта.


Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: Johnik от Январь 16, 2015, 21:35
А какая сигнатура у метода MainWindow::showStatusBarMessage() и в какой секции описан?


Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: alex312 от Январь 17, 2015, 16:16
в методе MainWindow::showStatusBarMessage неверная сигнатура. Может где-то не хватает спецификатора const ?


Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: phpCoder от Январь 18, 2015, 16:36
Проблема решилась, только забыл как ее решил.

А сигнал так отправляется, потому что от qobject не наследуется дважды. Поэтому костыль.


Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: kambala от Январь 18, 2015, 17:13
интересно, хоть кто-то понял это объяснение?


Название: Re: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Отправлено: phpCoder от Январь 18, 2015, 20:35
Объясняю есчо раз: этот класс должен наследоваться другими классами. Но т.к. все остальные классы - виджеты, а этот класс - qobject, то наследовать его не получится. Тогда агрегация.

Ну если сделать через вызов метода будет правильнее, тогда так сделаю.