有时我们需要以阻塞的方式执行一点耗时的操作,这时需要主窗口光标呈现忙状态,GxtWaitCursor正是为此设计;重载的构造函数,可以让光标呈现忙状态一定时间后自动恢复。
GxtWaitCursor.h
#pragma once#include <QObject>//=======================================================================================
// 等待光标类
//=======================================================================================
class GxtWaitCursor : public QObject
{Q_OBJECTpublic:/*** 构造函数:使光标进入忙录状态*/GxtWaitCursor(QObject *parent = nullptr);/*** 构造函数:使光标进入忙录状态并于指定时长后恢复*/GxtWaitCursor(int msec, QObject *parent = nullptr);/*** 析构函数:恢复光标*/~GxtWaitCursor();private:void beginWait(int msec = 0);void endWait();private:/*** 光标是否已经恢复*/bool m_cursorHasRestored { false };
};
GxtWaitCursor.cpp
#include <QTimer>
#include <QCursor>
#include <QGuiApplication>
#include "GxtWaitCursor.h"//=======================================================================================
GxtWaitCursor::GxtWaitCursor(QObject *parent): QObject(parent)
{beginWait();
}//=======================================================================================
GxtWaitCursor::GxtWaitCursor(int msec, QObject *parent): QObject(parent)
{beginWait(msec);
}//=======================================================================================
GxtWaitCursor::~GxtWaitCursor()
{endWait();
}//=======================================================================================
void GxtWaitCursor::beginWait(int msec)
{m_cursorHasRestored = false;QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));if (msec > 0){QTimer::singleShot(msec, [this]{if (!m_cursorHasRestored){QGuiApplication::restoreOverrideCursor();m_cursorHasRestored = true;}});}
}//=======================================================================================
void GxtWaitCursor::endWait()
{if (!m_cursorHasRestored){QGuiApplication::restoreOverrideCursor();m_cursorHasRestored = true;}
}