Qt中如何使窗口隐藏最小化到托盘

Qt中如何使窗口隐藏最小化到托盘,第1张

功能:窗口最小化后或者点击“hide”按钮将窗口隐藏到托盘

通常最小化的窗口会在任务栏上显示一个按钮。当用户按一下这个按钮,窗口就还原了。这是一个被大多数桌面环境,比如Windows,KDE,GNOME所采用的普遍设计。不过,因为任务栏通常只是桌面边上一小行,容纳不了很多按钮,用凯慎户通常希望把那些不常用的程序隐藏起来,只在通知栏显示一个小图标,要使用的时候再点击那个小图标恢复窗口。这种作法最典型的例子是QQ和Winamp。

最基本的思路是拦截窗口的最小化事件changeEvent(),通过重写changeEvent()即可。

“hide”按钮的方式,是通过信号--槽来实现。

--------------------------------------------------------------------

void TrayMenu::createActions()

{

//创建托盘项

action_show = new QAction(this)

action_quit = new QAction(this)

action_login_home = new QAction(this)

action_help = new QAction(this)

action_about = new QAction(this)

action_check_update = new QAction(this)

action_setting = new QAction(this)

//设置托盘项图标

action_show->setIcon(QIcon(":/icon/open"))

action_login_home->setIcon(QIcon(":/icon/home"))

action_help->setIcon(QIcon(":/icon/help"))

action_about->setIcon(QIcon(":/icon/about"))

action_check_update->setIcon(QIcon(":/icon/update"))

action_setting->setIcon(QIcon(":/icon/set"))

action_quit->setIcon(QIcon(":/icon/quit"))

//知派加载图片和提示

QIcon icon(":/images/sysTray.png")

systemTray = new QSystemTrayIcon(this)

systemTray->setIcon(icon)

systemTray->setToolTip("Hello, this is system tray!")

注意:这里特别提醒,如果你的应用程序要移植到别的机器上,而且这个机器没有装Qt,QIcon的图片格式最好用png,而不要用ico等格式,否则盯猛敬托盘图标不能显示,会很麻烦。

//设置托盘想文本

action_show->setText(QString("显示"))

action_quit->setText(QString("退出"))

action_login_home->setText(QString("登录网页"))

action_help->setText(QString("帮助"))

action_about->setText(QString("关于"))

action_check_update->setText(QString("检查更新"))

action_setting->setText(QString("设置"))

//添加菜单项

this->addAction(action_show)

this->addAction(action_setting)

this->addAction(action_login_home)

this->addSeparator()

this->addAction(action_help)

this->addAction(action_about)

this->addAction(action_check_update)

this->addSeparator()

this->addAction(action_quit)

action_setting->setVisible(false)

//设置信号连接(这里仅列举连接显示窗口的信号)

QObject::connect(action_show, SIGNAL(triggered(bool)), this, SIGNAL(showWidget()))

}

LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent)

{

QSystemTrayIcon *system_tray = new QSystemTrayIcon()

//放在托盘提示信息、托盘图标

system_tray ->setToolTip(QString("我就是托盘"))

system_tray ->setIcon(QIcon(":/icon/login"))

TrayMenu *tray_menu = new TrayMenu()

system_tray->setContextMenu(tray_menu)

//点击托盘执行的事件

connect(system_tray , SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconIsActived(QSystemTrayIcon::ActivationReason)))

connect(tray_menu, SIGNAL(showWidget()), this, SLOT(showNormal()))

//显示托盘

system_tray->show()

//托盘显示提示信息

system_tray->showMessage(QString("托盘标题"), QString("托盘显示内容"))

}

void LoginDialog::iconIsActived(QSystemTrayIcon::ActivationReason reason)

{

switch(reason)

{

//点击托盘显示窗口

case QSystemTrayIcon::Trigger:

{

showNormal()

break

}

//双击托盘显示窗口

case QSystemTrayIcon::DoubleClick:

{

showNormal()

break

}

default:

break

}

}

OK,这样我们的托盘功能就Over了!

=============================================================================

另://关闭到托盘

void Widget::closeEvent(QCloseEvent *e)

{

e->ignore()

this->hide()

}

//最小化到托盘

void Widget::changeEvent(QEvent *e)

{

if((e->type()==QEvent::WindowStateChange)&&this->isMinimized())

{

QTimer::singleShot(100, this, SLOT(close()))

}

}

或者(me)

//点击窗口的“最小化"按钮会调用此函数(系统默认)---已实现

void maxLinksGuard::changeEvent(QEvent * event )

{

if(event->WindowStateChange)

{

switch(this->windowState())

{

//点击“最小化”按钮

case Qt::WindowMinimized:

this->hide()

this->setWindowFlags(Qt::Tool)//隐藏任务栏上图标

systemTray->show()//显示托盘

systemTray->showMessage(windowTitle(),"Here is system,double click will show!")//提示

event->ignore()

break

default:

break

}

}

}

//托盘图标事件--------已实现

void maxLinksGuard::iconActivated(QSystemTrayIcon::ActivationReason reason)

{

switch (reason)

{

//单击托盘

case QSystemTrayIcon::Trigger:

{

if(!this->isVisible())

{

this->setWindowFlags(Qt::Window)//显示之前恢复

showNormal()

}

else

{

hide()

}

break

}

//双击托盘---貌似不起作用

case QSystemTrayIcon::DoubleClick:

{

if(!this->isVisible())

{

this->setWindowFlags(Qt::Window)//显示之前恢复

showNormal()

}

else

{

hide()

}

break

}

case QSystemTrayIcon::MiddleClick:

{

break

}

default:

}

}

//点击窗口的“关闭”按钮触发closeEvent事件(关闭应用程序)----已实现

void maxLinksGuard::closeEvent(QCloseEvent *event)

{

if (this->isVisible())

{

QMessageBox::critical(NULL,QObject::tr("Prompt:"),QObject::tr("Are you sure you want to kill/stop the MaxLinksGuard?"))

event->ignore()

}

else

{

event->accept()

}

}

==========================================================

QT 是什么 ?

一般情况 任务栏点右键旦睁闷模弯-属性 里能看到一个 通知区域 这个就是右下角的图标设置

点自定义早高 然后把你要隐藏的图标找到然后选择始终隐藏就好了~

关闭按钮无法删除,但是可以禁用,方法如下:

首先在你的窗体类中引入一些Windows API需要的消洞定义谨辩

const uint SC_CLOSE = 0xf060

const uint MF_GRAYED = 0x01

const uint MF_BYCOMMAND = 0x0

[DllImport("user32.dll")]

static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem,

uint uEnable)

[DllImport("user32.dll")]

static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert)

[DllImport("user32.dll")]

static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags)

然后可以在窗体的Load事件中祥桥缺加入下列初始化代码

IntPtr hSysMenu

hSysMenu = GetSystemMenu(this.Handle, false)

EnableMenuItem(hSysMenu, SC_CLOSE, MF_GRAYED)

RemoveMenu(hSysMenu, SC_CLOSE, MF_BYCOMMAND)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12453114.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存