我们知道,在windows上通过鼠标双击某应用程序图标,该应用程序往往会以顶层窗口的形式呈现在我们面前,但是对于一个已经打开的非顶层窗口,我们怎么将其激活为顶层窗口呢?
要达到激活,这个必须要满足两个条件,第一,必须要有通知激活的人,这个人必须是另一个应用程序(或同一应用程序的不同示例),他能发送信息给该窗体;第二,该窗体能够解析出该消息。至于一个应用程序如何向另一个应用程序发送消息的方法有很多,如共享内存,网络的方式等等。这里就不做详述,好,闲话少说,我们进入正题,有了前面的两个条件,假设现在该窗体所在的应用程序解析到了另一个应用程序的通知激活消息,那麽该窗体怎么将其激活为桌面的顶层窗体呢?
- void CWidget::activateWindow()
- {
- Qt::WindowStates winStatus = Qt::WindowNoState;
- if (windowState() & Qt::WindowMaximized)
- {
- winStatus = Qt::WindowMaximized;
- }
- setWindowState(Qt::WindowMinimized);
- setWindowState(Qt::WindowActive | winStatus);
- setGeometry(curGemRect);
- QWidget::activateWindow();
- raise();
- }
上面代码中setWindowState(Qt::WindowActive)和QWidget::activateWindow()两个应该是必须调用的,raise()是多个活动窗口时必调用的。
通过在窗体处理函数中调用上述函数,就可以将该窗体设为顶层窗体,其中,CWidget派生自QWidget(当然其他窗体也行,只要窗体的最终父类是QWidget就行),curGemRect是CWidget的成员变量,用来保存窗体的几何位置,这样就能记住窗体上一次弹出的位置,不过还要重载两个函数,resizeEvent和moveEvent,以保证窗体大小和位置改变后能时刻记住其位置。
- voidCWidget::resizeEvent(QResizeEvent*event)
- {
- curGemRect = geometry();
- }
- void CWidget::moveEvent(QMoveEvent *event)
- {
- curGemRect = geometry();
- }
http://www.xuebuyuan.com/2221681.html
Qt最小化到托盘、恢复并置顶
在window.h文件中添加如下内容:
//window.h
QSystemTrayIcon *trayicon;
QMenu *trayiconMenu;
//托盘点击处理槽函数
private slots:
void onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason);
在window.cpp文件中添加如下内容,在构造函数中对添加的两个变量进行初始化添加托盘图标,链接槽函数,其中槽函数用于响应在托盘图标及托盘菜单上的鼠标点击操作:
//window.cpp
trayicon = new QSystemTrayIcon(this);
connect(trayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason)));
QIcon icon("MyICO.ico");
trayicon->setIcon(icon);
trayicon->show();
//最小化处理
void Window::changeEvent(QEvent *e)
{
if((e->type()==QEvent::WindowStateChange)&&this->isMinimized())
{
this->hide();
// QTimer::singleShot(100, this, SLOT(close()));
}
}
//实现槽函数
void BluetoothSMS::onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
//单击
case QSystemTrayIcon::Trigger:
//双击
case QSystemTrayIcon::DoubleClick:
if(this->isHidden())
{
//恢复窗口显示
this->show();
//一下两句缺一均不能有效将窗口置顶
this->setWindowState(Qt::WindowActive);
this->activateWindow();
ui->MsgText->setFocus();
}
else
{
this->hide();
}
break;
default:
break;
}
}