Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: gil9red от Июля 01, 2012, 18:57



Название: [РЕШЕНО] Скрытие окна с taskbar
Отправлено: gil9red от Июля 01, 2012, 18:57
Здравствуйте :)
пишу программу, создающую заметки, вот собственно ссылка на ехе:
http://dl.dropbox.com/u/76167203/Note.exe

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


Название: Re: Скрытие окна с taskbar
Отправлено: mutineer от Июля 01, 2012, 19:10
Qt::WA_DeleteOnClose Пробовал ставить?


Название: Re: Скрытие окна с taskbar
Отправлено: gil9red от Июля 01, 2012, 19:44
Да, не помогает этот атрибут


Название: Re: Скрытие окна с taskbar
Отправлено: gil9red от Июля 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();
    }
};



Название: Re: Скрытие окна с taskbar
Отправлено: gil9red от Июля 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();
    }
};

это создание обычного виджета, без рамки, которого менеджер окон не показывает на панели задач, но хотелось бы кроссплатформенности :)


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

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


Название: Re: Скрытие окна с taskbar
Отправлено: mutineer от Июля 02, 2012, 00:20
Но чтоб не сомневаться у вас всегда есть вариант:
Код
C++ (Qt)
   virtual void mouseDoubleClickEvent(QMouseEvent *)
   {
       delete this;
   }

deleteLater() побезопаснее будет


Название: Re: Скрытие окна с taskbar
Отправлено: LisandreL от Июля 02, 2012, 00:40
deleteLater() побезопаснее будет
Чем безопасней? В этой функции обращений к объекту больше нет, а если оно есть где-то в другом участке кода, то цикл обработки сообщений всё равно удалит виджет, так что всё равно на таком ображении мы упадём.


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


Название: Re: Скрытие окна с taskbar
Отправлено: mutineer от Июля 02, 2012, 10:24
deleteLater() побезопаснее будет
Чем безопасней? В этой функции обращений к объекту больше нет, а если оно есть где-то в другом участке кода, то цикл обработки сообщений всё равно удалит виджет, так что всё равно на таком ображении мы упадём.

А если обращение есть в вызывающем mouseDoubleClickEvent коде после вызова mouseDoubleClickEvent, то может случиться бо-бо