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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как осветлить QWidget и все компоненты на нем ?  (Прочитано 4965 раз)
izoomer
Гость
« : Январь 27, 2007, 09:04 »

[QT-4.2.0 Linux]
Во  время работы программы нужно что бы появлялось окно с ошибкой поверх главного окна приложения. Как сделать так, что бы основное окно при этом как бы осветлялось или (и) теряло резкость ну и соотыетсвенно при закрытии окна с ошибкой опять востанавливалось к нормальному рабочему виду?
Записан
Dendy
Гость
« Ответ #1 : Январь 27, 2007, 11:35 »

1. Разместить поверх окна полупрозрачньІй QRubberBand.
2. Временно заменить содержимое главного окна на пиксмапу, потом вернуть обратно.

Код:
QPixmap px = QPixmap::grabWidget( very_main_window );
QPainter p( &px );
p.setBrush( QColor( 255, 255, 255, 127 ) ); // highligh a bit
p.setPen( Qt::NoPen );
p.drawRect( px.rect() );
p.end();
Записан
izoomer
Гость
« Ответ #2 : Январь 28, 2007, 17:20 »

Цитата: "Dendy"

2. Временно заменить содержимое главного окна на пиксмапу, потом вернуть обратно.

Код:
QPixmap px = QPixmap::grabWidget( very_main_window );
QPainter p( &px );
p.setBrush( QColor( 255, 255, 255, 127 ) ); // highligh a bit
p.setPen( Qt::NoPen );
p.drawRect( px.rect() );
p.end();

то есть сначала разместить такой пиксмап поверх всего окна ... а затем просто его удалить ?
Записан
Dendy
Гость
« Ответ #3 : Январь 28, 2007, 20:38 »

Да. Заднее окно на время "замрёт".
Записан
izoomer
Гость
« Ответ #4 : Январь 29, 2007, 17:58 »

ок.
Спасибо за помощь.

добавлено спустя 16 часов:

 
Цитата: "izoomer"
Цитата: "Dendy"

2. Временно заменить содержимое главного окна на пиксмапу, потом вернуть обратно.

Код:
QPixmap px = QPixmap::grabWidget( very_main_window );
QPainter p( &px );
p.setBrush( QColor( 255, 255, 255, 127 ) ); // highligh a bit
p.setPen( Qt::NoPen );
p.drawRect( px.rect() );
p.end();

то есть сначала разместить такой пиксмап поверх всего окна ... а затем просто его удалить ?

в догонку ещё вопрос по этой же теме ...
а как быть если не известно что счас на заднем фоне ?... то есть я вот использую qInstallMsgHandler
Код:

#include <QApplication>
#include <QWidget>
#include <QTextCodec>
#include "mainwindow.h"

void myMessageOutput(QtMsgType type, const char *msg)
 {
     switch (type) {
     case QtDebugMsg:
         fprintf(stderr, "Debug: %s\n", msg);
         break;
     case QtWarningMsg:
         fprintf(stderr, "Warning: %s\n", msg);
         break;
     case QtCriticalMsg:
         fprintf(stderr, "Critical: %s\n", msg);
         break;
     case QtFatalMsg:
         fprintf(stderr, "Fatal: %s\n", msg);
         abort();
     }
 }

int main(int argc, char *argv[])
{
qInstallMsgHandler(myMessageOutput);
QApplication app(argc, argv);

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

MainWindow window;
window.resize(800, 600);
window.clearFocus();
window.setWindowFlags(Qt::Window | Qt::X11BypassWindowManagerHint);
              window.showFullScreen();
return app.exec();
}


только соответственно по ошибке будет окно выскакивать и затемнятся (осветляться) задний план (по описанному выше механизму) ... только как знать что грабить  в  QPixmap::grabWidget .... ? как в моем коде передать в обработчик ошибки что нужно грабить MainWindow window ?

добавлено спустя 3 часа 34 минуты:

 ну как быть ?
как получить отправителя ошибки ?
Записан
Dendy
Гость
« Ответ #5 : Январь 29, 2007, 19:29 »

Да никак. Собственно непонятно зачем сие Вам нужно. Кроме того ничего у вас не получится сграбить из не-основного потока.
Записан
izoomer
Гость
« Ответ #6 : Январь 29, 2007, 21:02 »

Цитата: "Dendy"
Да никак. Собственно непонятно зачем сие Вам нужно. Кроме того ничего у вас не получится сграбить из не-основного потока.

Хотелось при появлении окна с ошибкой ( своего - кастомного окна) затенять задний фон пиксмапом ... причем на этом пиксмапе ещё и свои изображения должный быть
Записан
nova
Гость
« Ответ #7 : Январь 29, 2007, 21:46 »

На первый вопрос...
Может проще при вызове сообщения об ошибке позвать для главного окна setEnabled (FALSE); а после обработки ошибки setEnabled (TRUE);
Улыбающийся
Записан
izoomer
Гость
« Ответ #8 : Январь 30, 2007, 00:26 »

по умолчанию виджет от QDialog являетс модальным ... потому setEnable безсмысленно ... хотелось бы именно затемнять окно пиксмапом с сгарбленым окном и ещё нарисоват на этом пиксмапе на фоне ненавязчивую картинку ... вот задача
Записан
nova
Гость
« Ответ #9 : Январь 30, 2007, 21:10 »

А в чем проблема?
На счет setEnable не бессмысленно, ты делаеш setEnable а затем вызываеш диалог, окно станет серым Улыбающийся
На счет картинки не понял в чем проблема. Указатель на окно есть, this называется, че еще надо ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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