欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Qt 自定义QTabWidget

程序员文章站 2022-04-14 15:35:07
思路: QTabWidget的特点:点击不同的选项卡显示不同的窗口。可以将QTabWidget分成两部分: (1).选项卡:点击时要知道点击的是哪个选项。则需要将选项卡和窗口的信息存起来,点击时去这个信息中判断; (2).窗口:点击某个选项卡时,相应的窗口显示,其他窗口隐藏,可以将这些窗口全部放到一 ......

思路:

qtabwidget的特点:点击不同的选项卡显示不同的窗口。可以将qtabwidget分成两部分:

  (1).选项卡:点击时要知道点击的是哪个选项。则需要将选项卡和窗口的信息存起来,点击时去这个信息中判断;

  (2).窗口:点击某个选项卡时,相应的窗口显示,其他窗口隐藏,可以将这些窗口全部放到一个布局中。

 

(1)创建一个结构体,包含选项卡和窗口的信息:

 
struct tabwidgetitem {
  qstring id;           //每项的id
  qwidget* window;      //窗口
  iconbutton* icon;     //选项卡
  int status;           //0选中; 1选中
};
 
qlist<tabwidgetitem*> m_ptabwidgetlist;   //存放整个tabwidget(选项卡和窗口所有信息)信息的list列表
 

(2)初始化布局和结构体

void tabwidget::initlayout()
{

  qhboxlayout* pmainlayout = new qhboxlayout(this);
  pmainlayout->setmargin(1);
  pmainlayout->setspacing(10);

  qvboxlayout* piconlayout = new qvboxlayout();
  qvboxlayout* pwindowlayout = new qvboxlayout();
 
  pmainlayout->addlayout(pwindowlayout);
  pmainlayout->addlayout(piconlayout);
}
 

void tabwidget::inittabwidgetitemdata()
{

  {
    tabwidgetitem* pitem = new tabwidgetitem;
    pitem->id = "real";
 
    qwidget* pbasewidget = new qwidget(this);
    pitem->window = pbasewidget;
    pitem->window->setvisible(false);
    pwindowlayout->addwidget(pitem->window);

       pitem->icon = new iconbutton("实时视频", this);
       piconlayout->addwidget(pitem->icon);
       connect(pitem->icon, signal(clicked(iconbutton*)), this, slot(sltmenuclicked(iconbutton*)));
 
       pitem->status = false;
       m_ptabwidgetlist.append(pitem);
   }
 
  {
    tabwidgetitem* pitem = new tabwidgetitem;
    pitem->id = "local";
 
    qwidget* pbasewidget = new qwidget(this);
    pitem->window = pbasewidget;
    pitem->window->setvisible(false);
    pwindowlayout->addwidget(pitem->window);

       pitem->icon = new iconbutton("本地回放", this);
       piconlayout->addwidget(pitem->icon);
       connect(pitem->icon, signal(clicked(iconbutton*)), this, slot(sltmenuclicked(iconbutton*)));
 
       pitem->status = false;
       m_ptabwidgetlist.append(pitem);
   }
}
 
(3)自定义选项卡iconbutton
iconbutton.h文件
 
#pragma once
 
#include <qwidget>
 
class iconbutton: public qwidget
{
    q_object
public:
    explicit iconbutton(qstring title, qwidget *parent = 0);
    ~iconbutton();

private:

    qlabel* m_ptitle;
private:
    void initlayout();
public:
    void settitle(qstring title);
protected:
    void mousereleaseevent(qmouseevent *event);
signals:
    void clicked();
signals:
    void clicked(iconbutton*);
}
 
iconbutton.cpp文件
#include "iconbutton.h"
iconbutton::iconbutton(qstring title, qwidget *parent)
    : qwidget(parent)
{
    initlayout();
    settitle(title);
}

void iconbutton::initlayout()
{
    m_pmainlayout = new qhboxlayout(this);
 
    m_ptitle = new qlabel(this);
    m_ptitle->setstylesheet("qlabel{font-size:15px;font-weight:100;color:white;}");
    m_pmainlayout->addwidget(m_ptitle, 0, qt::alignleft);
}

void iconbutton::settitle(qstring title)
{
    m_ptitle->settext(title);
}

void iconbutton::mousereleaseevent(qmouseevent *event)
{
    if (qt::leftbutton == event->button())
    {
        /* 只处理鼠标在按钮区域弹起 */
        if (this->rect().contains(event->pos()))
        {
            /* 单击 */
            emit clicked();
            emit clicked(this);   //关键:单击返回this指针
        }
    }
}
 

(4)设置切换函数

void tabwidget::settabwidgetactivepage(qstring id)
{
    qwidget* pnextwindow = null;
    for (int i = 0; i < m_ptabwidgetlist.size(); i++) {   //先将所有窗口隐藏
        tabwidgetitem* item = m_ptabwidgetlist.at(i);
        item->status = 0;
        item->icon->setchekced(false);
        item->window->hide();
        if (item->id == id) {
            item->status = 1;
            item->icon->setchekced(true);
            pnextwindow = item->window;
        }
    }
    if (pnextwindow) {
        pnextwindow->show();   //再显示选择的窗口
    }
}

void tabwidget::sltmenuclicked(iconbutton * btn)
{
    for (int i = 0; i < m_ptabwidgetlist.size(); i++) {
        tabwidgetitem* item = m_ptabwidgetlist.at(i);
        if (item->icon == btn) {
            settabwidgetactivepage(item->id);
            break;
        }
    }
}
 
tabwidget::tabwidget(qwidget *parent)
{
    inittabwidgetdata();
    settabwidgetactivepage("real");
}
 
(5)大功告成
 
我只是把核心代码写下来了,别的花里胡哨的添加自己写...