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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Скрытие окна с taskbar  (Прочитано 6683 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Июль 01, 2012, 18:57 »

Здравствуйте Улыбающийся
пишу программу, создающую заметки, вот собственно ссылка на ехе:
http://dl.dropbox.com/u/76167203/Note.exe

Хотелось бы чтобы окна заметок не висели на панели задач, только это можно сделать с помощью:
  • средств qt (которые не предназначены для этого - setWindowFlags())
  • юзая winapi
если использовать первый вариант то для этого нужны флаги: Tool, SplashScreen и т.д., только проблема в том что эти окна при закрытии не освобождаются, а продолжают висеть в памяти, только их не видно,
 делать через winapi я не знаю как, да и хочется сделать кроссплатформенное приложение.
Подскажите, как можно решить эту дилемму, или как сделать через winapi  Улыбающийся
Заранее спасибо.
« Последнее редактирование: Ноябрь 11, 2012, 20:33 от gil9red » Записан

mutineer
Гость
« Ответ #1 : Июль 01, 2012, 19:10 »

Qt::WA_DeleteOnClose Пробовал ставить?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Июль 01, 2012, 19:44 »

Да, не помогает этот атрибут
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Июль 01, 2012, 19:57 »

вот тестовый пример с использованием флага и атрибута:
Код:
class AbstractNote: public QWidget
{
    Q_OBJECT
public:
    explicit AbstractNote(QWidget *parent = 0)
    {
        setWindowFlags(Qt::SplashScreen);
        setAttribute(Qt::WA_DeleteOnClose);
    }

protected:
    virtual void paintEvent(QPaintEvent *)
    {
        QPainter painter(this);

        painter.setBrush(Qt::yellow);
        painter.drawRect(rect());
    }

    virtual void mouseDoubleClickEvent(QMouseEvent *)
    {
        close();
    }
};

Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Июль 01, 2012, 20:10 »

Если использовать winApi, то пример будет таким:
Код:
class AbstractNote: public QWidget
{
    Q_OBJECT
public:
    explicit AbstractNote(QWidget *parent = 0)
    {
        setWindowFlags(Qt::Window | Qt::FramelessWindowHint);

        HWND hwnd = winId();

        SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_TOOLWINDOW);

        show();
    }

protected:
    virtual void paintEvent(QPaintEvent *)
    {
        QPainter painter(this);

        painter.setBrush(Qt::yellow);
        painter.drawRect(rect());
    }

    virtual void mouseDoubleClickEvent(QMouseEvent *)
    {
        close();
    }
};

это создание обычного виджета, без рамки, которого менеджер окон не показывает на панели задач, но хотелось бы кроссплатформенности Улыбающийся
Записан

LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июль 02, 2012, 00:19 »

Да, не помогает этот атрибут
С чего вы это взяли? Определил деструктор:
Код
C++ (Qt)
   ~AbstractNote()
   {
       qDebug( "deleted" );
   }
Исправно вызывается по двойному щелчку.

Но чтоб не сомневаться у вас всегда есть вариант:
Код
C++ (Qt)
   virtual void mouseDoubleClickEvent(QMouseEvent *)
   {
       delete this;
   }
Записан
mutineer
Гость
« Ответ #6 : Июль 02, 2012, 00:20 »

Но чтоб не сомневаться у вас всегда есть вариант:
Код
C++ (Qt)
   virtual void mouseDoubleClickEvent(QMouseEvent *)
   {
       delete this;
   }

deleteLater() побезопаснее будет
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Июль 02, 2012, 00:40 »

deleteLater() побезопаснее будет
Чем безопасней? В этой функции обращений к объекту больше нет, а если оно есть где-то в другом участке кода, то цикл обработки сообщений всё равно удалит виджет, так что всё равно на таком ображении мы упадём.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Июль 02, 2012, 04:04 »

Ну взял с того что у меня программа не закрывалась, когда юзал этот атрибут Смеющийся
Похоже это из-за того что я не описывал деструктор Улыбающийся
Спасибо за подсказку  Улыбающийся
не знал про qDebug( "deleted" ), но разве куДэбаг не используется только в отладочных версиях?? Покрайней мере у меня компилятор (MinGW) ругался, когда я компилировал под релиз, а qDebug забывал закомментировать Смеющийся
« Последнее редактирование: Июль 02, 2012, 04:09 от gil9red » Записан

mutineer
Гость
« Ответ #9 : Июль 02, 2012, 10:24 »

deleteLater() побезопаснее будет
Чем безопасней? В этой функции обращений к объекту больше нет, а если оно есть где-то в другом участке кода, то цикл обработки сообщений всё равно удалит виджет, так что всё равно на таком ображении мы упадём.

А если обращение есть в вызывающем mouseDoubleClickEvent коде после вызова mouseDoubleClickEvent, то может случиться бо-бо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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