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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как отображать программу только в области оповещения после запуска?  (Прочитано 11470 раз)
virtual_root
Гость
« : Декабрь 17, 2010, 21:59 »

Доброго времени суток! Подскажите,пожалуйста,решение!
 Я использую класс QSystemTrayIcon, программа после запуска приложения появляется в области оповещения,но с панели задач не могу заставить её уйти! А если свернуть приложение она остаются только в области оповещения, а мне нужно было чтобы она сразу там была при запуске. Может кто-нибудь сталкивался с подобным?

Пишу такой код: файл .h
Код:
class SystemTray : public QLabel {
Q_OBJECT
private:
    QSystemTrayIcon* m_ptrayIcon;
    QMenu*           m_ptrayIconMenu;
    bool             m_bIconSwitcher;

protected:
    virtual void closeEvent(QCloseEvent*);

public:
    SystemTray(QWidget* pwgt = 0);


};

Файл .cpp :
Код:
SystemTray::SystemTray(QWidget* pwgt)
    : QLabel("", pwgt)
    , m_bIconSwitcher(true)
{

    QAction* pactQuit = new QAction("&Quit", this);
    connect(pactQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
    m_ptrayIconMenu = new QMenu(this);
    m_ptrayIconMenu->addAction(pactQuit);

    m_ptrayIcon = new QSystemTrayIcon(this);
    m_ptrayIcon->setContextMenu(m_ptrayIconMenu);
    m_ptrayIcon->setToolTip(QString::fromLocal8Bit("Ёлочка"));
    m_ptrayIcon->setIcon(QPixmap(":/images/icon.gif"));
    m_ptrayIcon->show();
}

void SystemTray::closeEvent(QCloseEvent* pe)
{
    if (m_ptrayIcon->isVisible()) {
        hide();
    }
}

В файле main.cpp только создаю объект своего класса.
Записан
SimpleSunny
Гость
« Ответ #1 : Декабрь 17, 2010, 22:46 »

В конце конструктора допишите hide() или QTimer::singleshot(0, this, hide());
Записан
virtual_root
Гость
« Ответ #2 : Декабрь 17, 2010, 23:28 »

дописала hide(), но это не помогло.
В своей программе я создаю gif анимацию,новогоднюю елочку,хотела чтобы она запускалась,пряталась в область оповещения,но сама ёлочка всегда оставалась на рабочем столе. Всё сделала,а вот убрать с панели задач не могу...
Файлы программы: systemtray.h
Код:
#ifndef SYSTEMTRAY_H
#define SYSTEMTRAY_H

#include <QLabel>

class QSystemTrayIcon;
class QMenu;
class SystemTray : public QLabel {
Q_OBJECT
private:
    QSystemTrayIcon* m_ptrayIcon;
    QMenu*           m_ptrayIconMenu;
    bool             m_bIconSwitcher;

protected:
    virtual void closeEvent(QCloseEvent*);

public:
    SystemTray(QWidget* pwgt = 0);


};

#endif // SYSTEMTRAY_H

systemtray.cpp
Код:
#include "systemtray.h"
#include <QtGui>
#include <QTimer>

SystemTray::SystemTray(QWidget* pwgt /*=0*/)
    : QLabel("", pwgt)
    , m_bIconSwitcher(true)
{

    QAction* pactQuit = new QAction("&Quit", this);
    connect(pactQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
    m_ptrayIconMenu = new QMenu(this);
    m_ptrayIconMenu->addAction(pactQuit);

    m_ptrayIcon = new QSystemTrayIcon(this);
    m_ptrayIcon->setContextMenu(m_ptrayIconMenu);
    m_ptrayIcon->setToolTip(QString::fromLocal8Bit("Ёлочка"));
    m_ptrayIcon->setIcon(QPixmap(":/images/icon.gif"));
    m_ptrayIcon->show();
    hide();
}

void SystemTray::closeEvent(QCloseEvent* pe)
{
    if (m_ptrayIcon->isVisible()) {
        hide();
    }
}

main.cpp
Код:
#include "systemtray.h"
#include <QtGui>
class Window : public QLabel {
private:
    QPoint  m_ptPosition;

protected:
    virtual void Window::mousePressEvent(QMouseEvent* pe)
    {
        m_ptPosition = pe->pos();
    }

    virtual void Window::mouseMoveEvent(QMouseEvent* pe)
    {
        move(pe->globalPos() - m_ptPosition);
    }

public:
    Window(QWidget* pwgt = 0)
        : QLabel(pwgt,  Qt::FramelessWindowHint | Qt::Window)
    {
    }
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    SystemTray   st;
    Window       win;
    QMovie       mov("elka7.gif");
    QPixmap  pix(":/images/elka7.gif");
    win.setMask(pix.mask());
    win.setMovie(&mov);
    win.resize(240,400);
    win.show();
    mov.start();
    return app.exec();
}
и конечно же файл ресурсов с картинками.
« Последнее редактирование: Декабрь 17, 2010, 23:30 от virtual_root » Записан
SimpleSunny
Гость
« Ответ #3 : Декабрь 17, 2010, 23:33 »

http://www.forum.crossplatform.ru/index.php?showtopic=3333
http://www.prog.org.ru/topic_9754_0.html;prev_next=next
Записан
virtual_root
Гость
« Ответ #4 : Декабрь 18, 2010, 00:13 »

огромное спасибо! Помогла установка флага Qt::Tool.
Записан
virtual_root
Гость
« Ответ #5 : Декабрь 18, 2010, 00:34 »

Извините,пожалуйста,за глупый вопрос. Но возможно ли собрать мою программу в один exe файл, чтобы не приходилось тащить  собой библиотеки:qtcored4.dll , mingwn10.dll , qtgui4.dll (этот файл аж 131 мегабайт!!! это же ужас с собой столько таскать!) Читала на форуме статьи http://www.prog.org.ru/topic_15839_0.html и http://www.prog.org.ru/topic_15904_0.html, но что-то смутно понимаю что нужно делать. Из консоли что ли придётся собирать exe-шник? Как это тогда правильно сделать???
Записан
SimpleSunny
Гость
« Ответ #6 : Декабрь 18, 2010, 00:34 »

компилируйте в релиз сборке и носите около 10Мб
Записан
eldar85
Гость
« Ответ #7 : Декабрь 18, 2010, 01:03 »

почему то я попробовал ваш пример и у меня ругается компилятор на эти строки

    virtual void Window::mousePressEvent(QMouseEvent* pe)
    {
        m_ptPosition = pe->pos();
    }
    virtual void Window::mouseMoveEvent(QMouseEvent* pe)
    {
        move(pe->globalPos() - m_ptPosition);
    }

вот такое выдает
extra qualification 'Window::' on member 'mousePressEvent'
Записан
eldar85
Гость
« Ответ #8 : Декабрь 18, 2010, 01:21 »

и куда вы этот флаг поместили Qt::Tool Непонимающий
Записан
virtual_root
Гость
« Ответ #9 : Декабрь 18, 2010, 01:22 »

Выкладываю весь проект. Попробуйте на его основе создать новое приложение в Qt(пустой проект GUI),добавьте туда файлы: systemtray.h , systemtray.cpp и в файл main.cpp перепишите соответствующий код. Создайте в папке с проектом папку images. В Qt добавьте файл ресурсов и назовите его images, добавьте в него приставку  /  теперь можно добавить файлы. Добавьте файл ёлочки и файл иконки(они должны быть в папке images). После сборки должно всё работать). На всякий случай добавьте картинки в папку с exe-шником(debug)   Улыбающийся
Записан
virtual_root
Гость
« Ответ #10 : Декабрь 18, 2010, 01:26 »

А вы случайно не знаете как всё в один exe-шник собрать,чтобы не таскать с собой библиотеки? Подмигивающий
Записан
eldar85
Гость
« Ответ #11 : Декабрь 18, 2010, 01:41 »

я знаю как сделать установочный файл, можно будет его запустить, он установит его как программу и скажем на рабочем столе создаст лэйбл и само собой в пуске. а чтобы библиотеки статично компилировать - сам Qt говорит что нужно в .pro файле записать не помню точно что то типа -staticlib  но мне это не помогло. если вы в креаторе пишите то на сколько я нашел информации то все же придется его пересобирать что давольно таки проблемно, а вот как я вам сначала сказал способ - очень удобен, программа получается как заводская, длл устанавливаются на диск С и не мешаются))
« Последнее редактирование: Декабрь 18, 2010, 01:54 от eldar85 » Записан
eldar85
Гость
« Ответ #12 : Декабрь 18, 2010, 01:44 »

так вы все же в debug собираете программу? нужно же в relise потому что debug несет в себе всю отладочную информации и дллки будут весить как вы заметили около 140 метров) а если соберете relise то около 10 и то если будете делать установочный файл как я говорил то он сожмет дллки и ехе в 4 метра
Записан
eldar85
Гость
« Ответ #13 : Декабрь 18, 2010, 02:07 »

все же на эти строки ругается, без них работает но нельзя сдвинуть эконку которая на рабочем столе и какая то она серая получилась, не такая мигающая как должна))
    
Код:
    virtual void Window::mousePressEvent(QMouseEvent* pe)
    {
        m_ptPosition = pe->pos();
    }

    virtual void Window::mouseMoveEvent(QMouseEvent* pe)
    {
        move(pe->globalPos() - m_ptPosition);
    }
« Последнее редактирование: Декабрь 18, 2010, 02:18 от eldar85 » Записан
eldar85
Гость
« Ответ #14 : Декабрь 18, 2010, 02:24 »

а ругался он потому что функции были описаны внутри класса, сделал так и все гуд, кроме того что елочка тупо серая. видимо .gif не поддерживается.

Код:
#include "window.h"
#include <QtGui>
class Window : public QLabel {
private:
    QPoint  m_ptPosition;

protected:
    virtual void mousePressEvent(QMouseEvent* pe);


    virtual void mouseMoveEvent(QMouseEvent* pe);

public:
    Window(QWidget* pwgt = 0)
        : QLabel(pwgt,  Qt::Tool)
    {
    }
};

void Window::mousePressEvent(QMouseEvent *pe)
{
    m_ptPosition = pe->pos();
}

void Window::mouseMoveEvent(QMouseEvent *pe)
{
    move(pe->globalPos() - m_ptPosition);
}



int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QApplication::setQuitOnLastWindowClosed(false);
    SystemTray   st;
    Window       win;
    QMovie       mov("elka.gif");
    QPixmap  pix(":/images/elka.gif");
    win.setMask(pix.mask());
    win.setMovie(&mov);
    win.resize(240,400);
    win.show();
    mov.start();
    QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Calc",
    QSettings::NativeFormat);
    qDebug()<< settings.value("layout").toString();
    settings.setValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", "Milkyway");
    settings.setValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\Galaxy\\Sun", "OurStar");
    settings.value("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\Galaxy\\Default"); // returns "Milkyway"
    return app.exec();
}

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


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