现在用到的挺多的软件基本都需要实现到这些个的功能。
1.对于无边框透明的窗口,其实两个设置两句话就搞定了
setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::FramelessWindowHint);
然后就是这样之后无法响应鼠标的拖动,所以你要重载时间处理函数来实现鼠标的按下然后拖动的时间,其实就是根据鼠标的移动事件,判断如果按键是按下的状态,那么久move整个控件这样子。当然你觉得如果好多个窗口都要实现这个功能或者说你觉的写在程序的窗口类里面去重载这些个函数不太好。那么你可以自己建一个QOBJECT,然后利用这个object来处理窗口的事件。例如你的win窗口,需要实现这个功能,那么你就调用
win->installEventFilter(this);this指的是你自己新建的用来处理拖动的时间的qobject类,然后多个win你都可以注册到这个obj上,之后你注册过的窗口的事件都会经过这个obj,你就可以在这里:eventFilter(QObject* obj, QEvent* event) 拿到鼠标的移动的信息,还可以判断拿到的对象,然后去实现想要的功能。其实用到的就是installEventFilter这个函数的事件注册的效果而已,然后有一点比较重要的就是:installEventFilter注册过的窗口,事件触发时候的优先级是越后注册的优先级越高,所以在后来注册的类里如果你在eventFilter里做完处理return了一个true,那消息就不会继续走,后面(先前注册的类)就拿不到这个消息。这个是要注意一下的,根据需求也能调整一下注册的顺序。对应的卸载就是removeEventFilter函数。
2.然后说一下托盘的事情
托盘其实利用的是QSystemTrayIcon这个类来实现。
system_tray = new QSystemTrayIcon(this);
system_tray->setToolTip("标题");
system_tray->setIcon(QIcon(":/image/image/mhbox.ico"));
TrayMenu *tray_menu = new TrayMenu(this);
system_tray->setContextMenu(tray_menu);
connect(ui->pushButton_close,&QPushButton::clicked,this,[=](){this->hide();});
connect(tray_menu,&TrayMenu::appShow,this,[=](){this->showNormal();});
connect(tray_menu,&TrayMenu::appInfo,this,[=](){});
connect(tray_menu,&TrayMenu::appQuit,this,[=](){qApp->exit();});
connect(system_tray,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason reason){
if(reason == QSystemTrayIcon::DoubleClick)
{
this->showNormal();
}
});
system_tray->show();
这个应该比较简单了,然后里面的对应的TrayMenu就需要重载一下QMenu实现一下对应的QAction和signal就好了:
class TrayMenu : public QMenu
{
Q_OBJECT
public:
QAction* action_quit;
QAction* action_about;
QAction* action_restore;
explicit TrayMenu(QWidget *parent = 0);
void createAction();
signals:
void appQuit();
void appShow();
void appInfo();
public slots:
};
TrayMenu::TrayMenu(QWidget *parent) :
QMenu(parent)
{
createAction();
}
void TrayMenu::createAction()
{
action_quit = new QAction(this);
action_quit->setIcon(QIcon(":/image/image/close.png"));
action_quit->setText("退出");
action_about = new QAction(this);
action_about->setIcon(QIcon(":/image/image/info.png"));
action_about->setText("关于");
action_restore = new QAction(this);
action_restore->setIcon(QIcon(":/image/image/home.png"));
action_restore->setText("还原程序");
this->addAction(action_restore);
this->addAction(action_about);
this->addSeparator();
this->addAction(action_quit);
//信号
connect(action_restore,&QAction::triggered,this,&TrayMenu::appShow);
connect(action_about,&QAction::triggered,this,&TrayMenu::appInfo);
connect(action_quit,&QAction::triggered,this,&TrayMenu::appQuit);
}
这样就是实现的大概,具体的都是进一步来修改。
3.然后最后就是这个任务栏图标的问题。
任务栏就是我们window下边的现实打开的程序的那个地方。可能你需要说不想要你的程序显示在那里,比如像qq这样子的窗口,那么其实你可以这样设置:
setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint|Qt::Tool);
其实也就比之前多了一个这个Qt::WindowStaysOnTopHint|Qt::Tool,前一个是指定窗口的置顶,后一个就是实现隐藏的任务栏图标,但是如果是最小化的话,会出现一个悬浮的小窗口,解决就是如果有托盘,那么点击最小化的时候你截取事件然后触发hide而不是最小化就好了。