crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Прозрачность в потоке, Не хочет работать 4.7
cupersuper
  опции профиля:
сообщение 9.4.2015, 14:42
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 5.5.2011
Пользователь №: 2654

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте! Qt 4.7. Вне потока код работает нормально:

QImage IMG;
QPainter PAINTER;
QPen PEN;

IMG.load("img.jpg");
PAINTER.begin(&IMG);

PEN.setColor("#ff0000");
PAINTER.setOpacity(0.30);
PAINTER.setPen(PEN_T);
PAINTER.drawText( 20, 20, QString::fromLocal8Bit("Тест"));

Но когда помещаю в поток drawText крашит:
QObject::killTimers: timers cannot be stopped from another thread

Если убрать метод:
PAINTER.setOpacity(0.30);
Или передать в него 0 или 1, начинает работать.

Пробовал менять его на:
QColor clr = QColor("#ff0000");
PEN.setColor( QColor( clr.red(), clr.green(), clr.blue(), 254 ) );
Не помогает

Может кто знает какой-нибудь "костыль"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 9.4.2015, 16:47
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Что именно помещается в поток? Вызов отдельного метода?
И что означает фраза "Вне потока работает нормально...", что под этим понимается?

Сообщение отредактировал wiz29 - 9.4.2015, 16:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
cupersuper
  опции профиля:
сообщение 10.4.2015, 7:54
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 5.5.2011
Пользователь №: 2654

Спасибо сказали: 0 раз(а)




Репутация:   0  


mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    MThread = new MyThread();
    MThread->start();
}
mythread.cpp
MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
}

void MyThread::run()
{
    QImage IMG;
    QPainter PAINTER;
    QPen PEN;
    IMG.load("img.jpg");
    PAINTER.begin(&IMG);


    PEN.setColor("#ff0000");
    PAINTER.setOpacity(0.30); //Эта строчка
    PAINTER.setPen(PEN);
    PAINTER.drawText( 20, 20, "Test"); //крашит этот метод
    IMG.save("done.jpg");
}
Не работает

mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    QImage IMG;
    QPainter PAINTER;
    QPen PEN;
    IMG.load("img.jpg");
    PAINTER.begin(&IMG);


    PEN.setColor("#ff0000");
    PAINTER.setOpacity(0.30);
    PAINTER.setPen(PEN);
    PAINTER.drawText( 20, 20, "Test");
    IMG.save("done.jpg");
}
Работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 10.4.2015, 11:23
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Можете выложить тестовый проект в архиве? В коде, что вы привели, криминала не видно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
cupersuper
  опции профиля:
сообщение 10.4.2015, 15:23
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 5.5.2011
Пользователь №: 2654

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(wiz29 @ 10.4.2015, 11:23) *
Можете выложить тестовый проект в архиве? В коде, что вы привели, криминала не видно.

Проблемную строку закомментировал в файле mythread.cpp
Прикрепленный файл  thread_drawtext_error.zip ( 5 килобайт ) Кол-во скачиваний: 240
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 10.4.2015, 17:07
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Все работает

я заменил на такой код в потоковой функции
QImage IMG(QSize(300, 400), QImage::Format_ARGB32);
QPainter PAINTER;
QPen PEN;    
PAINTER.begin(&IMG);
PEN.setColor("#ff0000");
PAINTER.setPen(PEN);
PAINTER.setOpacity(0.30);
PAINTER.drawText( 20, 20, "Test");
IMG.save("done.jpg");


Какую версию Qt и ОС используете?

Я проверил на ОС Windows 7 и Qt 4.8.6 и Qt5.4.1

И на будущее, рекомендую сохранять файл в формате png, чтоб не было проблем связанных с потерей качества. Либо ставить для jpg параметр quality равным 100

Правда jpeg/jpg не сохраняют информацию для альфа-канала изображения.

//connect(MThread,SIGNAL(toInterfaseEND()),SLOT(fromMyThreadEND()));
connect(MThread,SIGNAL(toInterfaseEND()),SLOT(fromMyThreadEND()),
            Qt::QueuedConnection); //<- лучше делать так, когда сигнал генерируется в контексте другого потока.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.11.2024, 22:33