实现的逻辑如下
首先分析该功能需要实现的几个场景:
A 点击进入 B, B能够返回到A, A能够前进到B
A点击进入 B, B点击进入C, C返回到B后,B点击进入D,此时D返回到B,B返回到A。
因此可以使用两个栈,一个用来存储已经点击进入的文件浏览器地址叫后退栈,一个用来存储后退时文件浏览器地址栈pop掉的叫前进栈。
第一个场景只需要进行普通的push、pop操作就行了。
第二个场景则需要特殊处理,如果回退到某一浏览器地址然后点击新的浏览器地址的话,后退栈正常操作,但是前进栈需要清空,然后添加这个新浏览器地址。
bool m_ingoreUrlVisterFlag = false;//是否有前惠安还是后退方问当前地址的标志
QFileInfo m_lastUrlInfo; //上一次访问的地址保存的信息
定义两个堆QStack
QStack<QFileInfo> m_UrlStackBack; //后退的QStack
QStack<QFileInfo> m_UrlStackForword; //保存前的的QStack
QFileInfo可以定义为url地址要不文件路径,比如“C:\Windows\Temp” “C:\QMDownload” “C:\Program Files”
现在要实现的方式就是,
void XXXXXBrowser::SlotBrowserBack()
{
m_ingoreUrlVisterFlag = true;
if(m_UrlStackBack.size()>1&&m_UrlStackForword.size()==0)
{
QFileInfo dtFileInfo = m_UrlStackBack.pop();
if( dtFileInfo.exists() )
{
if(dtFileInfo.isDir())
{
m_UrlStackForword.push(dtFileInfo);
}
}
}
if(!m_UrlStackBack.isEmpty())
{
QFileInfo dtFileInfo = m_UrlStackBack.pop();
if( dtFileInfo.exists() )
{
if(dtFileInfo.isDir())
{
QString readString = "back url "+dtFileInfo.filePath();
qDebug("readString = %s",qPrintable(readString));
m_UrlStackForword.push(dtFileInfo);
VistorBrowserUrl(dtFileInfo);
EnableBtnStatus(m_UrlStackBack.size(),m_UrlStackForword.size());
}
else
{
m_ingoreUrlVisterFlag = false;
}
}
else
{
m_ingoreUrlVisterFlag = false;
}
}
else
{
m_ingoreUrlVisterFlag = false;
}
}
void XXXXXBrowser::SlotBrowserForward()
{
m_ingoreUrlVisterFlag = true;
if(m_UrlStackForword.size()>1&&m_UrlStackBack.size()==0)
{
QFileInfo dtFileInfo = m_UrlStackForword.pop();
if( dtFileInfo.exists() )
{
if(dtFileInfo.isDir())
{
m_UrlStackBack.push(dtFileInfo);
}
}
}
if(!m_UrlStackForword.isEmpty())
{
QFileInfo dtFileInfo = m_UrlStackForword.pop();
if( dtFileInfo.exists() )
{
if(dtFileInfo.isDir())
{
QString readString = "Forward url "+dtFileInfo.filePath();
qDebug("readString = %s",qPrintable(readString));
m_UrlStackBack.push(dtFileInfo);
VistorBrowserUrl(dtFileInfo);
EnableBtnStatus(m_UrlStackBack.size(),m_UrlStackForword.size());
}
else
{
m_ingoreUrlVisterFlag = false;
}
}
else
{
m_ingoreUrlVisterFlag = false;
}
}
else
{
m_ingoreUrlVisterFlag = false;
}
//m_ingoreUrlVisterFlag = false;
}
void XXXXXBrowser::VistorBrowserUrl(QTreeWidgetItem *pTreeItem, QFileInfo fileInfo)
{
if(m_ingoreUrlVisterFlag==false)
{
if(m_UrlStackBack.size()==0)
{
//first vise new url,or back is null later to vister newurl ,注意这是中式英语不要在意语法
if(m_lastfileInfo.isDir()==true)
{
m_UrlStackBack.push(m_lastfileInfo);
}
}
//访问新地址
if(m_lastfileInfo!=fileInfo&&fileInfo.isDir()==true)
{
m_UrlStackBack.push(fileInfo);
}
while(!m_UrlStackForword.isEmpty())
{
m_UrlStackForword.pop();
}
}
EnableBtnStatus(m_UrlStackBack.size(),m_UrlStackForword.size());
if(fileInfo.isDir()==true)
{
FileSystemWatcher::addWatchPath(this,fileInfo.filePath());
}
m_lastfileInfo = fileInfo;
m_ingoreUrlVisterFlag = false;
//以下是真正访问url做的事,比如把当前C:\Windows\Temp所有文件列出来等,有点像资源浏览器的后退前进方式
}
void XXXXXBrowser::EnableBtnStatus(int nBackSize,int nForwordSize)
{
m_backtoolButton->setEnabled(false);
m_forwardtoolButton->setEnabled(false);
if(nBackSize>0)
{
m_backtoolButton->setEnabled(true);
}
if(nForwordSize>0)
{
m_forwardtoolButton->setEnabled(true);
}
}
为什么前进,后退时都要压入上一个,那是因为当前页面地址,要不前进后退,第一下没反应,我的逻辑写完了,你们有更好的方法可以通知我