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

实现的逻辑如下 
首先分析该功能需要实现的几个场景:
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);
    }

}



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

猜你喜欢

转载自blog.csdn.net/qq_30377315/article/details/124430006
今日推荐