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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: 1 слот и множество сигналов?  (Прочитано 15633 раз)
HunteX
Гость
« Ответ #30 : Август 24, 2011, 21:09 »

Обычно делают так

Код
C++ (Qt)
UniStitch::Instance()->Write2Log("abc");
 
Instance - static. Write2Log - нет
Всё гениальное - просто? А ведь правда Улыбающийся

Спасибо Пантер, surendil, Даниил, Рома, ecspertiza и конечно, Igors за помощь - проблема решена!
Записан
HunteX
Гость
« Ответ #31 : Август 24, 2011, 21:12 »

Сделал проще, по совету Igors:

Код
C++ (Qt)
static class UniStitch : public QMainWindow
{
Q_OBJECT
 
public:
explicit UniStitch(QWidget *parent = 0);
~UniStitch();
 
void Write2Log(QString logLine);
 
static UniStitch *stitch;
 

Подключил unistitch.h ко всем *.cpp и использую так:
Код
C++ (Qt)
UniStitch::stitch->Write2Log("Требуется больше изображений!");
« Последнее редактирование: Август 24, 2011, 21:13 от HunteX » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #32 : Август 24, 2011, 21:16 »

Бррр. Это громоздко. Гораздо проще заюзать qDebug и написать свою функцию сохранения лога.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
HunteX
Гость
« Ответ #33 : Август 24, 2011, 21:19 »

Бррр. Это громоздко. Гораздо проще заюзать qDebug и написать свою функцию сохранения лога.
Через qInstallMsgHandler ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #34 : Август 24, 2011, 21:22 »

Ага. Вот тебе пример:
Код
C++ (Qt)
void logMessageOutput (QtMsgType type, const char *msg)
{
static QFile logFile;
static QTextStream stream;
stream.setCodec ("UTF-8");
 
static QMap <QtMsgType, QString> messages;
 
if (messages.isEmpty()) {
messages [QtDebugMsg] = "Debug";
messages [QtWarningMsg] = "Warning";
messages [QtCriticalMsg] = "Critical";
messages [QtFatalMsg] = "Fatal";
}
 
if (!logFile.isOpen ()) {
logFile.setFileName (QCoreApplication::applicationDirPath ()
+ "/"
+ QCoreApplication::applicationName ()
+ ".log");
logFile.open (QIODevice::WriteOnly | QIODevice::Append);
stream.setDevice (&logFile);
}
 
if (logFile.isOpen ()) {
stream << QDateTime::currentDateTime ().toString ("yyyy-MM-dd_hh:mm:ss")
  << " " << messages [type] << ": " << msg << endl;
}
}
 
« Последнее редактирование: Август 24, 2011, 21:25 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
HunteX
Гость
« Ответ #35 : Август 24, 2011, 21:26 »

Окей, учту и в следующем билде использую ваш вариант ... а он потоко-безопасен?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #36 : Август 24, 2011, 21:31 »

Мой вариант использовать не нужно - это всего лишь пример. У меня в 3-х проектах разные варианты. На счет потокобезопасности - не знаю. По идее, да - потокобезопасен, если проинициализировать в main. Вот, кстати, еще вариант:
Код
C++ (Qt)
const size_t maxLogFileSize = 1 * 1024 * 1024; //1 MB
 
class LogFile
{
public:
explicit LogFile (QtMsgType type) : type_ (type) {
 
messages_ [QtDebugMsg] = "Debug";
messages_ [QtWarningMsg] = "Warning";
messages_ [QtCriticalMsg] = "Critical";
messages_ [QtFatalMsg] = "Fatal";
 
fileNames_ [QtDebugMsg] = appName + "_debug.log";
fileNames_ [QtWarningMsg] = appName + "_warning.log";
fileNames_ [QtCriticalMsg] = appName + "_critical.log";
fileNames_ [QtFatalMsg] = appName + "_fatal.log";
 
file_.setFileName (QCoreApplication::applicationDirPath ()
  + "/"
  + fileNames_ [type_]);
QIODevice::OpenMode openMode = QIODevice::WriteOnly;
 
if (file_.exists () && file_.size () < maxLogFileSize) {
openMode |= QIODevice::Append;
}
 
file_.open (openMode);
 
stream_.setDevice (&file_);
stream_.setCodec ("UTF-8");
}
 
~LogFile () {
stream_.flush ();
file_.flush ();
file_.close ();
}
 
template <class T>
void setMessage (const T &msg) {
if (file_.isOpen ()) {
stream_ << QDateTime::currentDateTime ().toString ("yyyy-MM-dd hh:mm:ss")
<< " " << messages_ [type_] << ": " << msg << endl;
}
}
 
private:
LogFile (const LogFile &);
LogFile &operator= (const LogFile &);
 
private:
QtMsgType type_;
QMap <QtMsgType, QString> messages_;
QMap <QtMsgType, QString> fileNames_;
 
QFile file_;
QTextStream stream_;
};
 
typedef QSharedPointer <LogFile> LogFilePtr;
 
void logMessageOutput (QtMsgType type, const char *msg)
{
static QMap <QtMsgType, LogFilePtr> files;
 
if (!files.contains (type)) {
files [type] = LogFilePtr (new LogFile (type));
}
 
files [type]->setMessage (QString::fromUtf8 (msg));
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
HunteX
Гость
« Ответ #37 : Август 25, 2011, 21:19 »

Повесил qInstallMsgHandler, запускаю обработку в отдельном потоке ... должны обрабатываться 7 изображений, а получаю только 6, причем если делаю брейкпоинт перед функцией вызова обработки, то считает все 7 ... думаю, что проблемы из-за доступа потока обработки к GUI (к компоненту QTextBrowser - запись в него логов) Грустный Может быть такое?

p.s. при отключении qInstallMsgHandler, все работает отлично.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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