swt tray demo:右键菜单,单击隐藏,所有事件的例子

swt的system tray,只能处理三种事件:左键单击,左键双击和右键双击,右键单击
这是我看swt 3.0.1 win32的源码所知
此demo有以下功能:
1.左键单击时 ,隐藏,显示主窗口
2.右键单击,弹出菜单

注意:
1.左键双击和右键双击是一种事件,无法区分
2.左键双击将产生以下事件:左键单击,左键双击,左键单击
3.关于弹出菜单,menu必须有一个parent,如果程序里没有任何shell,可以建一个不可见的shell专门作为menu的parent.


import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.graphics.Image;

class HelloTray implements SelectionListener{

Display display;
Shell shell;
Button hello;
Tray tray;
TrayItem ti;
Menu menu;
MenuItem mi1;
MenuItem mi2;
MenuItem quit;

public HelloTray(){
display = Display.getDefault();
shell = new Shell();

FillLayout fillLayout = new FillLayout();
fillLayout.type = SWT.VERTICAL;
shell.setLayout(fillLayout);

hello = new Button(shell, SWT.NONE);
hello.setText("Hello World!");
   hello.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
       if(hello.getText().equals("Hello World!"))
         hello.setText("Clicked");
       else
         hello.setText("Hello World!");
}
});

menu=new Menu(shell);
mi1=new MenuItem(menu,SWT.PUSH);
mi1.setText("MenuItem 1");
mi1.addSelectionListener(this);
mi2=new MenuItem(menu,SWT.PUSH);
mi2.setText("MenuItem 2");
mi2.addSelectionListener(this);
quit=new MenuItem(menu,SWT.PUSH);
quit.setText("Quit");
quit.addSelectionListener(this);

//生成swt的tray
tray=display.getSystemTray();
ti=new TrayItem(tray,0);
ti.setToolTipText("This is a swt Tray!");
ti.setImage(new Image(display,"E://My Documents//My Pictures//alm.gif"));

//swt,tray的所有事件:
ti.addSelectionListener(new SelectionListener(){
//左键单击
public void widgetSelected(SelectionEvent e){
System.out.println("Tray Selcted");
//左键单击时 ,隐藏,显示主窗口
if(shell.isVisible()){
shell.setVisible(false);
}else{
shell.setVisible(true);
shell.forceActive();
}
}
//左键双击,右键双击,都是它
public void widgetDefaultSelected(SelectionEvent e){
System.out.println("Tray widgetDefaultSelected");
}
});
//右键单击,弹出菜单
ti.addListener(SWT.MenuDetect,new Listener(){
public void handleEvent(Event event){
System.out.println("SWT.MenuDetect");
menu.setLocation(display.getCursorLocation());
       menu.setVisible(true);
}
});
}

public void start(){
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}

public static void main(String[] args) {
HelloTray app=new HelloTray();
app.start(); 
}

public void widgetSelected(SelectionEvent e){
System.out.println(e.getSource()+" selected.");
if(e.getSource()==quit){
System.out.println("Quit");
display.dispose();
System.exit(0);
}
}

public void widgetDefaultSelected(SelectionEvent e){ 
}
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Qt 中,可以使用 QSystemTrayIcon 类来创建系统托盘图标。要处理系统托盘图标的右键点击事件,可以使用 QMenu 类来创建一个菜单,并使用 QSystemTrayIcon::setContextMenu() 将其设置为系统托盘图标的上下文菜单。当用户右键单击系统托盘图标时,应触发 QSystemTrayIcon::contextMenuRequested() 信号,您可以在这个信号的槽函数中显示您创建的菜单。 以下是一个示例代码,演示如何创建并处理系统托盘图标右键点击事件: ```cpp #include <QApplication> #include <QMenu> #include <QSystemTrayIcon> int main(int argc, char *argv[]) { QApplication app(argc, argv); QSystemTrayIcon trayIcon; QMenu *trayMenu = new QMenu(&trayIcon); QAction *quitAction = new QAction("Quit", trayMenu); QObject::connect(quitAction, &QAction::triggered, &app, &QApplication::quit); trayMenu->addAction(quitAction); trayIcon.setContextMenu(trayMenu); QObject::connect(&trayIcon, &QSystemTrayIcon::activated, [](QSystemTrayIcon::ActivationReason reason){ if (reason == QSystemTrayIcon::Trigger || reason == QSystemTrayIcon::DoubleClick) { // do something when the tray icon is clicked or double-clicked } }); trayIcon.show(); return app.exec(); } ``` 在这个示例代码中,我们创建了一个 QMenu 对象,并在其中添加了一个 QAction 对象,代表一个“Quit”菜单项。然后,我们将 QMenu 对象设置为 QSystemTrayIcon 对象的上下文菜单。在 QSystemTrayIcon::activated() 信号的槽函数中,我们检查 QSystemTrayIcon::ActivationReason 枚举的值,以确定用户是单击还是双击了系统托盘图标,并在需要时执行相应的操作。 希望这可以帮助您处理系统托盘图标的右键点击事件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值