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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 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), то сохранит моментально.
Ну да, если в буфер флешки влезет картинка, то "сохранено" будет мгновенно(только если флешку выдрать или свет рубануть, там её не будет).

В идеале, сделайте сохранение в другом потоке(Сохранение в память и прогресс бар имхо лишние), прогресс бар на сохранение скриншота в вызывает улыбку.
21  Qt / Вопросы новичков / Re: QTextStream пишет в файл с задержками ( можно ли всегда дергать flush ? ) : Август 21, 2018, 11:17
не хотите делать flush, сделайте логику чтобы перед падением этот flush вызвался. Или для критичных сообщений делайте flush, а обычные(после которых программа не упадет), без сброса на диск.
22  Qt / Вопросы новичков / Re: Как отобразить процесс сохранения QPixmap изображения в файл? : Август 21, 2018, 11:07
Я делал сохранение в память, но мне это для кэша нужно было. А вам прогресс бар для данной задачи совершенно не нужен. ИМХО, как правило меньше 5 секунд прогресс бар смысла не имеет.
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 секунд.
24  Программирование / Базы данных / Re: MySQL на Debian : Август 17, 2018, 17:20
Поставил 5.7. Ну её эту последнюю версию...
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));
28  Qt / 2D и 3D графика / Re: изменение размера QPixmap : Июль 26, 2018, 14:45
Примерно так (см. вложения)

Хочу нарисовать первым способом с таким же размытием как во втором способе.
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

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