Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: izoomer от Январь 27, 2007, 09:04



Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: izoomer от Январь 27, 2007, 09:04
[QT-4.2.0 Linux]
Во  время работы программы нужно что бы появлялось окно с ошибкой поверх главного окна приложения. Как сделать так, что бы основное окно при этом как бы осветлялось или (и) теряло резкость ну и соотыетсвенно при закрытии окна с ошибкой опять востанавливалось к нормальному рабочему виду?


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: Dendy от Январь 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();


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: izoomer от Январь 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();

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


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: Dendy от Январь 28, 2007, 20:38
Да. Заднее окно на время "замрёт".


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: izoomer от Январь 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 минуты:

 ну как быть ?
как получить отправителя ошибки ?


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: Dendy от Январь 29, 2007, 19:29
Да никак. Собственно непонятно зачем сие Вам нужно. Кроме того ничего у вас не получится сграбить из не-основного потока.


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: izoomer от Январь 29, 2007, 21:02
Цитата: "Dendy"
Да никак. Собственно непонятно зачем сие Вам нужно. Кроме того ничего у вас не получится сграбить из не-основного потока.

Хотелось при появлении окна с ошибкой ( своего - кастомного окна) затенять задний фон пиксмапом ... причем на этом пиксмапе ещё и свои изображения должный быть


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: nova от Январь 29, 2007, 21:46
На первый вопрос...
Может проще при вызове сообщения об ошибке позвать для главного окна setEnabled (FALSE); а после обработки ошибки setEnabled (TRUE);
:)


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: izoomer от Январь 30, 2007, 00:26
по умолчанию виджет от QDialog являетс модальным ... потому setEnable безсмысленно ... хотелось бы именно затемнять окно пиксмапом с сгарбленым окном и ещё нарисоват на этом пиксмапе на фоне ненавязчивую картинку ... вот задача


Название: как осветлить QWidget и все компоненты на нем ?
Отправлено: nova от Январь 30, 2007, 21:10
А в чем проблема?
На счет setEnable не бессмысленно, ты делаеш setEnable а затем вызываеш диалог, окно станет серым :)
На счет картинки не понял в чем проблема. Указатель на окно есть, this называется, че еще надо ?