C++ 后退前进资源浏览器实现方式,附代码

这篇博客讨论了如何实现一个文件浏览器的前进和后退功能。通过使用两个栈,一个存储后退路径,另一个存储前进路径,来管理用户的浏览历史。当用户后退或前进时,会根据特定的逻辑更新这两个栈,并调整按钮的启用状态。同时,当访问新地址时,会清空前进栈并更新最后访问的文件信息。整个实现确保了在用户导航过程中的正确性和连贯性。
摘要由CSDN通过智能技术生成
实现的逻辑如下 
首先分析该功能需要实现的几个场景:
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);
    }

}



为什么前进,后退时都要压入上一个,那是因为当前页面地址,要不前进后退,第一下没反应,我的逻辑写完了,你们有更好的方法可以通知我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值