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选中
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();
qvboxlayout* pwindowlayout = new qvboxlayout();
pmainlayout->addlayout(pwindowlayout);
pmainlayout->addlayout(piconlayout);
pmainlayout->addlayout(piconlayout);
}
void tabwidget::inittabwidgetitemdata()
{
{
pitem->icon = new iconbutton("实时视频", this);
piconlayout->addwidget(pitem->icon);
tabwidgetitem* pitem = new tabwidgetitem;
pitem->id = "real";
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);
}
{
pitem->icon = new iconbutton("本地回放", this);
piconlayout->addwidget(pitem->icon);
tabwidgetitem* pitem = new tabwidgetitem;
pitem->id = "local";
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
{
q_object
public:
explicit iconbutton(qstring title, qwidget *parent = 0);
~iconbutton();
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)
{
: qwidget(parent)
{
initlayout();
settitle(title);
}
void iconbutton::initlayout()
{
void iconbutton::settitle(qstring title)
{
m_ptitle->settext(title);
}
void iconbutton::mousereleaseevent(qmouseevent *event)
{
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_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指针
}
}
}
{
/* 只处理鼠标在按钮区域弹起 */
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();
{
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(); //再显示选择的窗口
}
}
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");
{
inittabwidgetdata();
settabwidgetactivepage("real");
}
(5)大功告成
我只是把核心代码写下来了,别的花里胡哨的添加自己写...
上一篇: layui禁用侧边导航栏点击事件
下一篇: 前端之css(宽高)设置小技巧