Russian Qt Forum
Ноябрь 01, 2024, 07:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'  (Прочитано 6912 раз)
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, пересобирал - бестолку

Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Январь 16, 2015, 19:28 »

Цитировать
У Qt как обычно - то понос, то золотуха.

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

ArchLinux x86_64 / Win10 64 bit
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Январь 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));
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #3 : Январь 16, 2015, 20:40 »

какой секретный смысл в том, чтобы пускать сигнал из себя известному объекту? можно же просто напрямую вызвать слот-метод у объекта.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #4 : Январь 16, 2015, 21:35 »

А какая сигнатура у метода MainWindow::showStatusBarMessage() и в какой секции описан?
« Последнее редактирование: Январь 16, 2015, 21:38 от Johnik » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #5 : Январь 17, 2015, 16:16 »

в методе MainWindow::showStatusBarMessage неверная сигнатура. Может где-то не хватает спецификатора const ?
Записан
phpCoder
Гость
« Ответ #6 : Январь 18, 2015, 16:36 »

Проблема решилась, только забыл как ее решил.

А сигнал так отправляется, потому что от qobject не наследуется дважды. Поэтому костыль.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #7 : Январь 18, 2015, 17:13 »

интересно, хоть кто-то понял это объяснение?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
phpCoder
Гость
« Ответ #8 : Январь 18, 2015, 20:35 »

Объясняю есчо раз: этот класс должен наследоваться другими классами. Но т.к. все остальные классы - виджеты, а этот класс - qobject, то наследовать его не получится. Тогда агрегация.

Ну если сделать через вызов метода будет правильнее, тогда так сделаю.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.18 секунд. Запросов: 23.