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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Всплывающие уведомления  (Прочитано 15593 раз)
Vitto74
Гость
« : Февраль 12, 2011, 13:55 »

Хочу поделится кодом, реализующим всплывающие сообщения на подобии тех, которые используются в IM клиентах. Код несколько сыроват, но допилить его под что угодно не составит труда.
Лицензия LGPL - пользуйтесь для любых целей, но измененные исходники модуля предоставьте пользователям.
Комменты на русском в кодировке UTF-8.
Код:
#include "popupmessage.h"

...

    //index - произвольные данные (см. исходник)
    PManager::addMessage(title, message, index);
« Последнее редактирование: Февраль 12, 2011, 14:06 от Vitto74 » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Февраль 15, 2011, 15:57 »

Цитировать
Код несколько сыроват
Да.

Код
C++ (Qt)
this->setWindowFlags(Qt::ToolTip);
this->index = index;
delete this->messages[0];
 
Вспомнился писон  Смеющийся

Код:
//Если объект просто уничтожить возникнет ошибка, т.к.
//мы уничтожаем самого себя. Поэтому скращаем время жизни до 50
//милисекунд
есть метод QObject::deleteLater().

Код
C++ (Qt)
static popupManager* getObj(){static popupManager *instance = new popupManager(); return instance;};
 
небольшая утечка в синглтоне.

Код:
//Переменная int index - это произвользые данные, которые передаются объекту при созданни.
//Тип может быть любым
Смысл этого не ясен, зачем? В смысле, ясно, что это что-то типа поля QVariant data(). Но зачем оно там?

Ну что еще сказать.. бывает оно такое и надо. Есть еще системный нотификатор в линупсах, его можно опционально юзать внутри твоей либы.
Записан

Гугль в помощь
Vitto74
Гость
« Ответ #2 : Февраль 15, 2011, 16:14 »

Код
C++ (Qt)
this->setWindowFlags(Qt::ToolTip);
this->index = index;
delete this->messages[0];
 
Вспомнился писон  Смеющийся

У меня такого кода там нет.

Код:
//Если объект просто уничтожить возникнет ошибка, т.к.
//мы уничтожаем самого себя. Поэтому скращаем время жизни до 50
//милисекунд
есть метод QObject::deleteLater().

Блин. Я еще так долго в этот участок кода втыкал - знал, что так не правильно, но так и не дошло что тут deleteLater использовать нужно.

Код
C++ (Qt)
static popupManager* getObj(){static popupManager *instance = new popupManager(); return instance;};
 
небольшая утечка в синглтоне.

Где именно? Я не очень хорошо в них разбираюсь.

Код:
//Переменная int index - это произвользые данные, которые передаются объекту при созданни.
//Тип может быть любым
Смысл этого не ясен, зачем? В смысле, ясно, что это что-то типа поля QVariant data(). Но зачем оно там?

В моей софтине, при клике, показывается главное окно с той вкладкой, которая вызвала появление уведомления. Мне достаточно int, но может так статься, что int будет мало для реагирования на клик мыши.
« Последнее редактирование: Февраль 16, 2011, 15:59 от Vitto74 » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Февраль 17, 2011, 01:36 »

насчет лика в синглтоне: поскольку статик поинтер аллоцируется и инициализируется через new, то его некому будет прибить по завершению проги. Ибо деструктор не вызовется. Лучше так сделать:

Код:
static popupManager* getObj()
{
    static popupManager instance;
    return &instance;
}
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Февраль 18, 2011, 09:21 »

Код
C++ (Qt)
this->setWindowFlags(Qt::ToolTip);
this->index = index;
delete this->messages[0];
 
Вспомнился писон  Смеющийся
У меня такого кода там нет.
Это копипаста из разных частей кода, но у тебя там все усеяно обращением к своим методам и переменым через this, как будто ты не знаешь что this-> - это лишнее...

В моей софтине, при клике, показывается главное окно с той вкладкой, которая вызвала появление уведомления. Мне достаточно int, но может так статься, что int будет мало для реагирования на клик мыши.
Ну как я и писал ранее, QVariant в этом случае лучше.
Записан

Гугль в помощь
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Февраль 18, 2011, 10:45 »

Цитировать
как будто ты не знаешь что this-> - это лишнее...
Ну, я б не стал так категорично заявлять.
Вот я к примеру наоборот, предпочитаю ставить this чтобы не путать чей это метод, ИМХО, так нагляднее.  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #6 : Февраль 19, 2011, 01:11 »

Цитировать
как будто ты не знаешь что this-> - это лишнее...
Ну, я б не стал так категорично заявлять.
Вот я к примеру наоборот, предпочитаю ставить this чтобы не путать чей это метод, ИМХО, так нагляднее.  Улыбающийся
Мне ни разу не приходилось так выделять. Обычно свои методы зову напрямую, чужие по указателю или ссылке. Вроде все наглядно. Функции почти не использую.
Записан

Гугль в помощь
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Февраль 22, 2011, 22:11 »

Цитировать
как будто ты не знаешь что this-> - это лишнее...
Ну, я б не стал так категорично заявлять.
Вот я к примеру наоборот, предпочитаю ставить this чтобы не путать чей это метод, ИМХО, так нагляднее.  Улыбающийся
Согласен, тоже всегда так делаю.

Мне ни разу не приходилось так выделять. Обычно свои методы зову напрямую, чужие по указателю или ссылке. Вроде все наглядно. Функции почти не использую.
Тогда ответь, mymethod() - это чей метод, класса MyClass или он вообще не принадлежит никому (описан вне класса)? Подмигивающий:
Код
C++ (Qt)
void MyClass::doit()
{
mymethod();
}
 

this намного повышает удобочитаемость. Другое дело, когда люди наследуют Class1 классом Class2 и вызывают Class1::method() в классе Class2 (в котором нет перегруженного method()) через this, так делать не надо.
« Последнее редактирование: Февраль 22, 2011, 22:22 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
asvil
Гость
« Ответ #8 : Февраль 22, 2011, 22:21 »

serg_hd, Вы привели код, в котором возможны только два следующих варианта:
Если вызов без this - это член этого класса. Поправлено
Если вызов без this - это статическая функция. Поправлено
Теперь давайте перечислим ситуации когда используются статические функции и мне кажется, что мы сможем четко определить, что названия методов и функций будут разительно отличаться. И вообще что это там за функции у кого-то в ООП? А ну-ка признавайтесь кто тут занимается функциональным программированием?
Хотя у нас на работе решили все статические функции обернуть пространствами имен. Голоса: трое к одному.

Чаще всего статические функции и классы смешиваются при написании ООП оберток для стабильных библиотек. А в стабильных библиотеках используется префиксная идентификация, например PGgetResult.

P.S. Прошу прощения, сначала хотел написать что-то, что уже не помню. Потом удалил, но слово "ничего" не удалил.
P.P.S. Статическая функция - это я зря сказал "статическая". Имел ввиду..эм.."глобальная", ну вообщем просто функция.
« Последнее редактирование: Февраль 23, 2011, 00:03 от Филоненко Михаил » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Февраль 22, 2011, 22:31 »

Если метод без ничего this это член этого класса.
Если метод без ничего this это статическая функция.
Честно признаться, мало что из этого понял, напоминает "казнить нельзя помиловать" (знаки препинания расставьте сами)Непонимающий
this - это вообще-то указатель на объект класса, а статическая функция не "без ничего" а с ключ. словом "static". Тем static-определения и отличаются от не статических, что static существуют в единственном экземпляре и вы не получите всяких "multiple definition", например если метод описан в .h и этот .h не единожды инклудится. И вообще, что значит "метод без ничего"?
« Последнее редактирование: Февраль 22, 2011, 22:48 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
ритт
Гость
« Ответ #10 : Февраль 22, 2011, 23:08 »

да, знаки препинания нынче совершенно вышли из моды...

но как бы то ни было, Михаил правильно сказал - префиксная идентификация для функций (опционально, в пространстве имён), инлайны где только возможно (но в меру, конечно же Показает язык ), this - там, где нужен указатель на "данный объект".
я бы сказал - "Голоса: четверо к одному." Улыбающийся

а вообще, это из той же песни, что и "ставить virtual перед методами классов-наследников или опускать?" - должно определяться внешними или внутренними правилами для всех разработчиков проекта - дабы поддерживать код в чистоте; иного профита в этом нет...
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #11 : Февраль 24, 2011, 11:38 »

Ну если все-таки придерживаться языка C++, то в нем обычных функций крайне мало, поэтому, this это все-таки перебор.

Кстати, раз уж всплыло, интересны мнения остальных по этому вопросу:
Цитировать
Ставить virtual перед методами классов-наследников или опускать?
Я у себя проставляю virtual, хотя интуитивно и без особых оснований... может для наглядности, когда смотришь на код наследника...
Записан

Гугль в помощь
ритт
Гость
« Ответ #12 : Февраль 24, 2011, 13:14 »

> Я у себя проставляю virtual, хотя интуитивно и без особых оснований... может для наглядности, когда смотришь на код наследника...
с другой стороны, бегай потом смотри у какого класса впервые данный виртуал появился

но это уже оффтоп - создавайте тему в говорилке, например.
Записан
Странник
Гость
« Ответ #13 : Август 05, 2011, 15:48 »

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

p.s.
поддерживается html-форматирование, гиперссылки, кастомные виджеты сообщений.
« Последнее редактирование: Август 06, 2011, 11:45 от Странник » Записан
SeverusSnape
Гость
« Ответ #14 : Август 05, 2011, 17:24 »

http://dl.dropbox.com/u/6896945/prettyosd.zip

Pretty OSD из Clementine Player
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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