Просмотр сообщений
|
Страниц: 1 [2] 3 4 ... 40
|
16
|
Qt / Многопоточное программирование, процессы / Re: Таймер в потоке
|
: Сентябрь 05, 2018, 20:29
|
а почему просто не выкинуть рассчитанные данные их класса другого потока в класс gui без таймера ?
У меня мониторинг постоянный, таймер нужен, но его можно и в гуйне запустить. хорошо, есть некая функция std::function<QList<Data>> someFunc = [](){return QStrorageInfo()....;}; и класс class MyGuiClass: public QObject { public slot: void someMethod(QList<Data>); } Нужно в потоке запустить someFuncton чтобы каждые N секунд гуйня получала список файлов. мониторинг задача фоновая, как правило на отлов ошибок и не очень важная и не должна отвлекать гуйню. Задача пустяковая и решить её можно множеством способов, как не отстрелить себе ногу, а наиболее грамотно это сделать? Ну и чтоб ошибок потенциальных, возможных крешей и падений не было.
|
|
|
17
|
Qt / Многопоточное программирование, процессы / Re: Таймер в потоке
|
: Сентябрь 05, 2018, 14:36
|
Зачем timeout в потоке? Я бы предложил тогда сделать класс Worker и перегрузить у него timerEvent() вместо QTimer. Ну или добавить 4й объект, который будет делать работу по таймеру, но это больше boilerplate кода.
В Timeout у меня "тяжелый" код, тот который должен считаться в отдельном потоке. (Ну т.е. он легкий, но в гуйне ему делать нечего) В принципе меня и вариант QtConcurrent::run устоил бы с while(!qApp->closingDown()) { ...hard...; sleep(10) }. Только программа при закрытие ждет 10 секундный интервал, чтоб поток завершить...
|
|
|
18
|
Qt / Многопоточное программирование, процессы / Re: Таймер в потоке
|
: Сентябрь 05, 2018, 12:57
|
Ок. А как правильно? только QTimer в другой поток выносить? И слот timeevent должен в потоке выполняться. Еще проблема, не могу в проекте передать QMap<QString, MyStruct> с опцией QueuedConnection. Пишет: QObject::connect: Cannot queue arguments of type 'QMap<QString, MyStruct>' Делал qRegistredMetaType, Q_DECLARE_METATYPE, все таже ошибка. Или отправлять пустой сигнал?
|
|
|
19
|
Qt / Многопоточное программирование, процессы / Таймер в потоке
|
: Сентябрь 05, 2018, 09:51
|
Нужен класс, который по таймеру из другого потока отправляет данные Интерфейс : QPointer<Checker> checker; connect(checker, &Checker::newData, this, &MyClass::process, Qt::BlockingQueuedConnection); // process(QMap<QString, int>), QueuedConnection - не соединяется
Накидал реализацию: .h class Checker: public QObject { Q_OBJECT QThread m_thread; QTimer m_timer;
signals: void stop();
private slots: void started(); void stoped(); void timeout();
public: Checker(); ~Checker(); Q_SIGNAL void newData(QMap<QString, int>); }; .cpp void Checker::started() { m_timer.start(1000); }
void Checker::stoped() { m_timer.stop(); }
void Checker::timeout() { emit newData({}); }
Checker::Checker() { this->moveToThread(&m_thread);
m_timer.moveToThread(&m_thread); m_thread.start();
connect(&m_thread, &QThread::started, this, &Checker::started); connect(this, &Checker::stop, this, &Checker::stoped); connect(&m_timer, &QTimer::timeout, this, &Checker::timeout); }
Checker::~Checker() { emit stop(); m_thread.quit(); m_thread.wait(); } Вроде работает, но валидно ли? И почему QueuedConnection не соединяет? Или через потоки только POD данные пробрасывать можно?
|
|
|
20
|
Qt / Вопросы новичков / Re: Как отобразить процесс сохранения QPixmap изображения в файл?
|
: Август 21, 2018, 13:23
|
Если изображение сохранять на флешку с максимальным качеством, то оно сохраняется довольно таки медленно. Сохраняется оно довольно быстро, просто флешка слишком тормозная(на фоне остальных типов памяти). Если же как я указал в примере с малым качеством(40), то сохранит моментально.
Ну да, если в буфер флешки влезет картинка, то "сохранено" будет мгновенно(только если флешку выдрать или свет рубануть, там её не будет). В идеале, сделайте сохранение в другом потоке(Сохранение в память и прогресс бар имхо лишние), прогресс бар на сохранение скриншота в вызывает улыбку.
|
|
|
23
|
Qt / Вопросы новичков / Re: Как отобразить процесс сохранения QPixmap изображения в файл?
|
: Август 21, 2018, 11:02
|
Даже на самую медленную флешку скриншот запишется настолько быстро, что прогрессбар не успеет появиться.
С 8 мониторов ultrahd на которых нарисованны котики недающие пожать png в пару киллобайт? на глючную флешку 1 Мб/сек? Сохраните в память, а потом с прогрессбаром на диск. (Из документации bool QPixmap::save(QIODevice *device, const char *format = nullptr, int quality = -1) const ) QPixmap pixmap; QByteArray bytes; QBuffer buffer(&bytes); buffer.open(QIODevice::WriteOnly); pixmap.save(&buffer, "PNG");
А потом с прогрессбаром на диск, и желательно расчитать оптимальный размер блока. Хотя по правде говоря прогресс бар даже не появиться, оптимальнее показать сообщние "Сохраняется" которое тут же будет заменяно "Сохранено" и скрыто через 5 секунд.
|
|
|
25
|
Программирование / Базы данных / MySQL на Debian
|
: Август 17, 2018, 16:02
|
На Debian поставил mysql 8.0 ( вместо mandrivadb - http://voidcat.us/2017/09/24/debian-9-mariadb-mysql/), как его с Qt подружить? Исходники не собираются: cd ....Qt5.11.1/5.11.1/Src/qtbase/src/plugins/sqldrivers$ qmake -- make sub-mysql ругается error: ‘my_bool’ does not name a type class ‘QMYSQLResultPrivate::QMyField’ does not have any field named ‘nullIndicator’ ... my_bool есть только в папке /usr/include/mariadb/ , но мне то mariadb не нужна.
|
|
|
26
|
Qt / 2D и 3D графика / Re: изменение размера QPixmap
|
: Июль 27, 2018, 10:33
|
Эти 2 способа рисуют корректно: QPixmap::scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)) QGraphicsPixmapItem::setTransformationMode(Qt::TransformationMode::SmoothTransformation);
Сделал первым способом, можно ли drawPixmap заставить масштабировать корректно? Или может есть еще сспособы?
|
|
|
27
|
Qt / 2D и 3D графика / Re: изменение размера QPixmap
|
: Июль 26, 2018, 16:30
|
Конечно можно попробовать взять painter->worldTransform().toAffine().m11 и m22, они содержат масштаб с которым происходит отрисовка.
qreal scale = painter->worldTransform().toAffine().m11(); QSize size = boundingRect().size().toSize(); painter->drawPixmap( boundingRect().topLeft(), m_pix.scaled(size*scale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
|
|
29
|
Qt / 2D и 3D графика / изменение размера QPixmap
|
: Июль 26, 2018, 14:20
|
В QGraphicScene рисую наследника QGraphicsItem, который отрисовывает QPixmap. Рисую как правило линии и текст. Проблема в том что при масштабировании вниз результат напоминает не сглаживание, а выкинутые пиксели - выглядит плохо. Данный код рисует корректно, но мне QGraphicsPixmapItem не подходит: QGraphicsPixmapItem *pixItem = scene->addPixmap( QPixmap() ); pixItem->setTransformationMode(Qt::TransformationMode::SmoothTransformation); Данный код немного размазывает границы при увеличении масштаба, но при уменьшении все выглядит так же плохо. painter->setRenderHint(QPainter::Antialiasing, true); painter->setRenderHint(QPainter::SmoothPixmapTransform, true); Теперь проблема: Внутри QGraphicsItem::paint // 1 способ painter->drawPixmap( boundingRect(), m_pix, m_pix.rect() );
// 2 способ QSize size = boundingRect().size().toSize(); painter->drawPixmap( boundingRect().topLeft(), m_pix.scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
второй способ рисует корректно, но иногда размер изображения больше чем размер элемента в сцене - и тогда при масштабе 200% мы получаем размытую картинку(что логично). первый способ увеличивает правильно, но размывает плохо - эффект пропущеных пикселей.
|
|
|
30
|
Qt / Общие вопросы / Re: Проверка корректности пути к файлу
|
: Июль 13, 2018, 15:08
|
Как изменить базовое имя файла? Может есть что то типа QFileInfo::setBaseName? Или только способ ниже? QFileInfo fileInfo(file); QString newBaseName = zzz(fileInfo.baseName()); return fileInfo.path() + (fileInfo.path().isEmpty()? "": "/") + newBaseName + (fileInfo.completeSuffix().isEmpty()? "": ".") + fileInfo.completeSuffix();
есть конечно const char *basename (const char *__filename) , но char*
|
|
|
Страниц: 1 [2] 3 4 ... 40
|
|
|