作者MOONY135 (谈无慾)
看板C_and_CPP
标题[问题] qt tray icon 问题
时间Sat Jan 14 09:21:36 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
vs2015
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
qt5.7
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
目前写的程式 在编译时 经常会在小图示的地方
出现很多我的程式的 tray icon
==================================================================
这边是拿teamViewer的小图示来做比喻(因为消失的速度太快来不及截图)
http://imgur.com/gSuzM8U 大概会是这种长相
==================================================================
但只要打开小图示的地方之後 就会自己自动清掉
不知道这是怎样的原因造成的呢
以下是我的程式码
QIcon icon = QIcon("IMAGE/logo.ico");
setWindowIcon(icon);
trayIcon = new QSystemTrayIcon(this);
trayIcon->setIcon(icon);
trayIcon->setToolTip("my app");
trayIcon->show();
//工具列图示设定
trayIconMenu = new QMenu(this);
restoreAction = new QAction("执行app设置", this);
connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));
quitAction = new QAction("退出", this);
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));//关闭app,qApp对
应的是程序全局唯一指针
trayIconMenu->addAction(restoreAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
trayIcon->setContextMenu(trayIconMenu);
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.160.80.105
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1484356898.A.C39.html
1F:推 CodingMan: 想知道+1 01/14 10:36
2F:→ bachelorwhc: 这我之前写过 不是用qt而是c# 01/14 12:23
3F:→ bachelorwhc: 也会遇到这样的问题 01/14 12:25
4F:推 rnbjacky: 看一下你的 trayicon 的 parent 有没有在程式终止时被 d 01/14 18:30
5F:→ rnbjacky: estory 掉 只要 parent-child ship 设定正确 trayicon 01/14 18:30
6F:→ rnbjacky: 自然会透过parent-child关系 在程式正常结束时被清掉 01/14 18:30
请问一下要怎样看
我的写法是这样
但我写this的话 我的parent就会是QMainWindow吧?
应该就是程式被关掉的时候(在工具列关掉)就要跟着被关掉了吧
#include "widgettest.h"
#include <QDebug>
widgetTEST::widgetTEST(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
trayIconMenu = new QMenu(this);
restoreAction = new QAction("执行app设置", this);
connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));
quitAction = new QAction("退出", this);
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));//关闭app,qApp对
应的是程序全局唯一指针
trayIconMenu->addAction(restoreAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
trayIcon->setContextMenu(trayIconMenu);
}
※ 编辑: MOONY135 (1.160.80.105), 01/14/2017 19:47:39
7F:推 rnbjacky: 请再帮忙看一下 widgetTest 的 parent 是谁 (把整个par 01/15 03:05
8F:→ rnbjacky: ent children 关系看一下 直到最 root,parent 是 nullp 01/15 03:05
9F:→ rnbjacky: tr 的那个 01/15 03:05
10F:→ rnbjacky: 然後看一下widgetTest 的 destructor 是不是有成功被呼 01/15 03:06
11F:→ rnbjacky: 叫 01/15 03:06
http://imgur.com/a/2cCP8 这是专案的位置
不知道您说的是在哪个资料夹里?
这边的意思应该是叫我去看VS ADD-IN自己生出来的ui.widgetTest.h档对吗?
/********************************************************************************
** Form generated from reading UI file 'widgettest.ui'
**
** Created by: Qt User Interface Compiler version 5.7.0
**
** WARNING! All changes made in this file will be lost when recompiling UI
file!
********************************************************************************/
#ifndef UI_WIDGETTEST_H
#define UI_WIDGETTEST_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_widgetTESTClass
{
public:
QMenuBar *menuBar;
QToolBar *mainToolBar;
QWidget *centralWidget;
QStatusBar *statusBar;
void setupUi(QMainWindow *widgetTESTClass)
{
if (widgetTESTClass->objectName().isEmpty())
widgetTESTClass->setObjectName(QStringLiteral("widgetTESTClass"));
widgetTESTClass->resize(600, 400);
menuBar = new QMenuBar(widgetTESTClass);
menuBar->setObjectName(QStringLiteral("menuBar"));
widgetTESTClass->setMenuBar(menuBar);
mainToolBar = new QToolBar(widgetTESTClass);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
widgetTESTClass->addToolBar(mainToolBar);
centralWidget = new QWidget(widgetTESTClass);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
widgetTESTClass->setCentralWidget(centralWidget);
statusBar = new QStatusBar(widgetTESTClass);
statusBar->setObjectName(QStringLiteral("statusBar"));
widgetTESTClass->setStatusBar(statusBar);
retranslateUi(widgetTESTClass);
QMetaObject::connectSlotsByName(widgetTESTClass);
} // setupUi
void retranslateUi(QMainWindow *widgetTESTClass)
{
widgetTESTClass->setWindowTitle(QApplication::translate("widgetTESTClass",
"widgetTEST", 0));
} // retranslateUi
};
namespace Ui {
class widgetTESTClass: public Ui_widgetTESTClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_WIDGETTEST_H
※ 编辑: MOONY135 (1.160.80.105), 01/15/2017 12:35:42
12F:推 rnbjacky: 不是这个 是要看初始化 widgetTest 的地方 看他的parent 01/15 15:52
13F:→ rnbjacky: widgetTEST::widgetTEST(QWidget *parent) << parent是? 01/15 15:53
14F:→ MOONY135: 大概要在哪边看阿 不会是moc_这个档案吧? 01/15 19:57
/****************************************************************************
** Meta object code from reading C++ file 'widgettest.h'
**
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.7.0)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
#include "../../widgettest.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qmetatype.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'widgettest.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.7.0. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
QT_BEGIN_MOC_NAMESPACE
struct qt_meta_stringdata_widgetTEST_t {
QByteArrayData data[1];
char stringdata0[11];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
qptrdiff(offsetof(qt_meta_stringdata_widgetTEST_t, stringdata0) + ofs \
- idx * sizeof(QByteArrayData)) \
)
static const qt_meta_stringdata_widgetTEST_t qt_meta_stringdata_widgetTEST = {
{
QT_MOC_LITERAL(0, 0, 10) // "widgetTEST"
},
"widgetTEST"
};
#undef QT_MOC_LITERAL
static const uint qt_meta_data_widgetTEST[] = {
// content:
7, // revision
0, // classname
0, 0, // classinfo
0, 0, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
0 // eod
};
void widgetTEST::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int
_id, void **_a)
{
Q_UNUSED(_o);
Q_UNUSED(_id);
Q_UNUSED(_c);
Q_UNUSED(_a);
}
const QMetaObject widgetTEST::staticMetaObject = {
{ &QMainWindow::staticMetaObject, qt_meta_stringdata_widgetTEST.data,
qt_meta_data_widgetTEST, qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};
const QMetaObject *widgetTEST::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() :
&staticMetaObject;
}
void *widgetTEST::qt_metacast(const char *_clname)
{
if (!_clname) return Q_NULLPTR;
if (!strcmp(_clname, qt_meta_stringdata_widgetTEST.stringdata0))
return static_cast<void*>(const_cast< widgetTEST*>(this));
return QMainWindow::qt_metacast(_clname);
}
int widgetTEST::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QMainWindow::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
return _id;
}
QT_END_MOC_NAMESPACE
※ 编辑: MOONY135 (1.160.80.105), 01/15/2017 20:00:32
15F:推 rnbjacky: 也不是这个 其实我的问题很简单..把使用 widgetTest 那 01/15 20:30
16F:→ rnbjacky: 行贴出来就行了 ... 01/15 20:30
18F:→ rnbjacky: 比较一下 main.cpp 第四行注解跟没注解掉的差别 看一下 01/15 20:32
19F:→ rnbjacky: 哪个 system tray 不会消失 01/15 20:32
20F:→ rnbjacky: 然後你需要阅读这个网页 因为你看不懂我上面再说什麽 01/15 20:33
22F:→ rnbjacky: 直接告诉你结论:你的 QSystemTrayIcon 的 dtor 没有被呼 01/15 20:35
23F:→ rnbjacky: 叫 所以程式结束时 还留在 window 系统上 01/15 20:35
24F:→ rnbjacky: 要让他的 dtor 被呼叫 一个是 call delete 01/15 20:36
25F:→ rnbjacky: 另一个是透过 我贴给你网页的那个观念 剩下交给你了 01/15 20:36
26F:→ MOONY135: 感恩 不过可能要拖一下= = 最近有点赶 01/16 09:35
27F:→ petercoin: 这问题我用WINAPI手刻的时候也遇过 就像r大说的是没有 01/16 14:01
28F:→ petercoin: 在离开程式前将tray icon清掉 最後就会留一堆在那边 01/16 14:02