Qt 自定义QTabWidget

2019-09-23 08:40:10来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Qt 自定义QTabWidget

思路:

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)大功告成   我只是把核心代码写下来了,别的花里胡哨的添加自己写...      

原文链接:https://www.cnblogs.com/tingtaishou/p/11547013.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C程序设计语言练习 第二章

下一篇:使用微信助手搭建微信返利机器人