QT浏览器学习之二:浏览器主界面(1)

长平狐 发布于 2013/01/11 10:33
阅读 459
收藏 0

 

原创文章,转载请注明出处,谢谢!
作者:清林,博客名:飞空静渡

 

这里的浏览器的制作是参考易简浏览器来制作的,在查看了易简浏览器的源代码0.45版本后,一步一步构建一个易简浏览器。

易简浏览器遵循GPL来发布,具体可以到易简浏览器主页上下载源代码来查看(http://eazy.uueasy.com/),在写这篇文章时,最新的是0.47版,但现在使用的是0.45版。

 

这个主界面只是一个未完成的简单的主界面,遵循着一步步构建的步骤,由简单到复杂,最后完成一个浏览器的步骤。

这步的浏览器,没有设计网页,只是一个简单的框架。下一步会构建复杂点的主界面,一步步的添砖加瓦,这也是学习的最好步骤。

 

我这里的易简浏览器代码和原作者的源代码有些不一样,所以在看我的代码时,要注意一点。代码不单是要看,要抄,还会要修改,这样才会学得到。

 

开发工具:Qtcreator。

 

这一个步骤的主界面如下:

 

下面是代码的简单说明:

主界面是一个MainWindow的类:

mainwindow.h:

#include <QPoint>
#include <QSize>
class TabToolBar;
class ToolBar;
class MainWindow : public QMainWindow
{
	Q_OBJECT
public:
	MainWindow (QWidget *parent = 0);
	virtual ~MainWindow ();
        QDockWidget *head;
        TabToolBar *m_pTopTab;
public slots:
        void slotWindowQuit();
        void slotWindowMin();
        void slotWindowMax();
protected:
        void mousePressEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void mouseDoubleClickEvent(QMouseEvent *event);
private:
        // test if the current window is maxisize
        // if the current windows is maxisize return true or return false
        bool bIsMaxiSize();
        // if window is max, set it to presize and prepoint or set it to max size
        void setMaxiSize();
private:
        // keep the pre window's point and size
        QPoint  m_windowPoint;
        QSize   m_windowSize;
        QPoint  m_dragPos;
        ToolBar *m_pMainToolBar;
	
};

 

主界面的构建如下:

MainWindow::MainWindow(QWidget *parent)
	:QMainWindow(parent)
{
	if(!BrowserWindow)
	{
		BrowserWindow = this;
	}
        setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); // no Boarder
        setWindowTitle(tr("Eazy"));
        QDockWidget *pMainDockWiget = new QDockWidget(this);
        m_pTopTab = new TabToolBar(this, this);
        pMainDockWiget->setTitleBarWidget(m_pTopTab);
        QMainWindow *pMainWindow = new QMainWindow(this);
        m_pMainToolBar = new ToolBar(this);
        pMainWindow->addToolBar(m_pMainToolBar);
        pMainDockWiget->setWidget(pMainWindow);
        pMainDockWiget->setFloating(false);
        pMainDockWiget->setFeatures(QDockWidget::NoDockWidgetFeatures);
        setCentralWidget(pMainDockWiget);
        // test
        this->resize(800, 600);
}

 

由上面的代码可以看到,主界面用

setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); // no Boarder

去掉了标题栏。

 

其头部有这几个结构组成:

一个QDockWidget的pMainDockWidget,这个是主的widget,所有widget都在这上面,所以最后会setCentralWidget(pMainDockWiget);

 

主widget会添加一个

m_pTopTab = new TabToolBar(this, this);
pMainDockWiget->setTitleBarWidget(m_pTopTab);

这是一个网页浏览的tab,这里还没添加实现代码。

 

下面是一个工具栏,工具栏嵌在QMainWindow中:

QMainWindow *pMainWindow = new QMainWindow(this);
m_pMainToolBar = new ToolBar(this);
pMainWindow->addToolBar(m_pMainToolBar);
pMainDockWiget->setWidget(pMainWindow);

 

移动界面靠

void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);

 

在void mouseMoveEvent(QMouseEvent *event)中:

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton)
    //if (event->button() == Qt::LeftButton) // not work
    {
        if (m_dragPos.y() < 20)
        {
            if (bIsMaxiSize())
            {
                setMaxiSize();
                move(event->globalPos() - QPoint(m_windowSize.width()/2, 5));
                m_dragPos = event->globalPos() - frameGeometry().topLeft();
            }
            else
            {
                move(event->globalPos() - m_dragPos);
            }
        }
        event->accept();
    }
}

 

靠 m_dragPos.y() < 20 这句判断限制只有在头部才可以移动整个界面,这和易简的代码不一样。

移动时如果界面是最大化,则缩小到其前一个状态时的大小。

 

源代码下载地址:http://download.csdn.net/source/3236209


原文链接:http://blog.csdn.net/fjb2080/article/details/6372169
加载中
返回顶部
顶部