• 18433阅读
  • 11回复

Qt4如何让窗口最小化到系统托盘中 [复制链接]

上一主题 下一主题
离线signallock
 

只看楼主 倒序阅读 楼主  发表于: 2009-01-21
— 本帖被 XChinux 执行加亮操作(2009-01-22) —
如题,我想用鼠标点击最小化按钮的时候,让窗口隐藏,QSystemTrayIcon已经做好了,不想真正最小化到任务栏,该怎么办?
换句话说,如何重新定义窗口最小化行为?
只看该作者 1楼 发表于: 2009-01-21
void QWidget::changeEvent ( QEvent * event )  [virtual protected]

查下是不是 QEvent::WindowStateChange事件,是的话再查下WindowState,最小化了就把窗口hide掉
离线signallock

只看该作者 2楼 发表于: 2009-01-21
感谢!!又学了不少:-D
只看该作者 3楼 发表于: 2009-01-21
引用第2楼signallock于2009-01-21 20:36发表的  :
感谢!!又学了不少:-D

其实多翻翻Assistant就什么都有了
离线signallock

只看该作者 4楼 发表于: 2009-01-21
嗯,我也是这样想的,但是不知道如何搜索自己需要的,就比如这个,我想改一下窗口最小化的行为,就不知道该怎么在assisstant里面找……
离线signallock

只看该作者 5楼 发表于: 2009-01-22
又出问题了,我按照上面做的,在linux下没问题,但是在windows下总是有问题,那个窗口先hide,之后又最小化,在任务栏里面还存在,而且点开之后有窗口框架,但是里面没有控件。再show一下又正常了。我试了一下,发现好像在changeEvent()执行之后,窗体还会继续最小化……我在里面调用了event->ignore()了,还是不行……
离线haulm

只看该作者 6楼 发表于: 2009-05-16
Qt助手里有个很好的托盘例子,简直所有东西都在里面体现了,最小化到托盘也就是重新定义关闭按钮的行为。

protected:
        void closeEvent(QCloseEvent *event);

void myclass::closeEvent(QCloseEvent *event)
{
    if (this->trayIcon->isVisible()) {
       hide();
        event->ignore();
    }
}

通过托盘菜单关闭程序

connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
离线hover_sky

只看该作者 7楼 发表于: 2009-05-16
引用第6楼haulm于2009-05-16 10:30发表的  :
Qt助手里有个很好的托盘例子,简直所有东西都在里面体现了,最小化到托盘也就是重新定义关闭按钮的行为。
protected:
        void closeEvent(QCloseEvent *event);
.......


这是点击“关闭”然后就最小化到托盘

期待点击“最小化”,然后最小化到托盘
离线hover_sky

只看该作者 8楼 发表于: 2009-05-16
引用第1楼都市无名者于2009-01-21 19:39发表的  :
void QWidget::changeEvent ( QEvent * event )   [virtual protected]
查下是不是 QEvent::WindowStateChange事件,是的话再查下WindowState,最小化了就把窗口hide掉


  1. void Dialog::changeEvent(QEvent * event )
  2. {
  3.     if(event->WindowStateChange)
  4.     {
  5.            switch(this->windowState()){
  6.                case Qt::WindowMinimized:
  7.                     this->hide();
  8.                     event->ignore();
  9.                    break;
  10.                 default:
  11.                    break;
  12.                }
  13.     }
  14. }


结果点击“最小化”按钮,状态栏还存在图标,但那个图标是“死的”了,点击它,还可以在桌面显示,但已经是白茫茫的一片。。。。
离线haulm

只看该作者 9楼 发表于: 2009-05-17
BS一下楼上,很好的例子再查下Qt助手就行了。
protected:
    void hideEvent(QHideEvent *event);

void Window::hideEvent(QHideEvent *event)
{
    if (trayIcon->isVisible()) {
        hide();
        event->ignore();
    }
}
离线nj_wyj

只看该作者 10楼 发表于: 2011-08-31
void Dialog::changeEvent(QEvent * event )
{
    if(event->WindowStateChange)
    {
           switch(this->windowState()){
               case Qt::WindowMinimized:
                    this->hide();

                this->setWindowFlags(Qt::Tool);     //隐藏任务栏上图标
                trayIcon->showMessage(windowTitle(),"系统在这里!双击可以恢复显示!");

                    event->ignore();
                   break;
                default:
                   break;
               }
    }
}

//托盘图标事件
void Dialog::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
    switch (reason) {
    case QSystemTrayIcon::Trigger:
    {
            break;
    }
    case QSystemTrayIcon::DoubleClick:
    {
        if(!this->isVisible())
        {
                              this->setWindowFlags(Qt::Dialog); //显示之前恢复
                 showNormal();
        }
        else
                 hide();
        break;
    }
    case QSystemTrayIcon::MiddleClick:
    {
        break;
    }
    default:
        ;
    }
}


注意退出要用QApplication::Quit();

离线roywillow

只看该作者 11楼 发表于: 2011-08-31
之前做过这个,但是效果不理想就放弃了
至少在windows下,hideEvent以及什么changeEvent似乎都是在窗口已经最小化后才发出的,也就是说,当你处理的时候,窗口已经最小化了
当时我是在hideEvent中用QTimer::singleShot调用hide(),确实成功隐藏了,但是当再次调用show进行显示的时候,会发现窗口其实是以最小化方式显示的,此时你还需要再次调用showNormal()(其实之前的show似乎也用不到了),才能正常再次显示出来
但是另外一个问题是,如果最小化之前窗口是最大化的,这样再次显示出来后就成了正常大小,所以或许还得随时记录一下窗口的状态,并且记录状态这个过程好像在hideEvent中记录是不准确的,因为这个事件发生时窗口的状态好像已经变了……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个