📄 panelswitcher.cpp
字号:
#include "panelswitcher.h"#include <qapplication.h>#include <qlayout.h>#include <qobjectlist.h>#include <qpixmap.h>#include <qtimer.h>#include <stdio.h>CachingWidget::CachingWidget(QWidget *parent, const char *name) : QWidget(parent, name) { setBackgroundMode(NoBackground);}void CachingWidget::setCached(bool enable) { if(enable) { m_buffer= QPixmap::grabWidget(this); QObjectList *l= queryList("QWidget"); QObjectListIt it(*l); QObject *obj; while((obj= it.current()) != NULL) { ((QWidget*) obj)->hide(); ++it; } delete l; } else { m_buffer.resize(0, 0); QObjectList *l= queryList("QWidget"); QObjectListIt it(*l); QObject *obj; while((obj= it.current()) != NULL) { ((QWidget*) obj)->show(); ++it; } delete l; }}void CachingWidget::paintEvent(QPaintEvent *evt) { if(!m_buffer.isNull()) { QPainter p(this); p.drawPixmap(evt->rect().topLeft(), m_buffer, evt->rect()); }}void CachingWidget::resizeEvent(QResizeEvent*) { setCached(false);}//--------------------------------//PanelSwitcher::PanelSwitcher(QWidget *parent, const char *name) : QScrollView(parent, name) , m_curpanel(0) , m_oldpanel(0) { setVScrollBarMode(AlwaysOff); setHScrollBarMode(AlwaysOff); setFrameStyle(NoFrame);}void PanelSwitcher::showPanel(int index) { m_oldpanel= m_curpanel; m_curpanel= index; if(m_entries.at(m_curpanel) != NULL) { m_entries.at(m_curpanel)->setFocus(); emit panelChanged(); if(m_oldpanel != m_curpanel) { if(m_entries.at(m_oldpanel) != NULL && m_entries.at(m_oldpanel)->isA("CachingWidget")) { ((CachingWidget*) m_entries.at(m_oldpanel))->show(); ((CachingWidget*) m_entries.at(m_oldpanel))->setCached(true); } if(m_entries.at(m_curpanel) != NULL && m_entries.at(m_curpanel)->isA("CachingWidget")) { ((CachingWidget*) m_entries.at(m_curpanel))->show(); ((CachingWidget*) m_entries.at(m_curpanel))->setCached(true); } animate(); } }}void PanelSwitcher::animate() { int ofsa, ofsb; for(int i= 0; i < 16; i++) { ofsa= contentsX(); ofsb= m_curpanel* width(); if(ofsa == ofsb) return; if(ofsa < ofsb) { ofsa+= 20; if(ofsa > ofsb) ofsa= ofsb; } if(ofsa > ofsb) { ofsa-= 20; if(ofsa < ofsb) ofsa= ofsb; } setContentsPos(ofsa, 0); if(ofsa == ofsb) break; } if(ofsa != ofsb) { QTimer::singleShot(0, this, SLOT(animate())); qApp->processOneEvent(); } else { if(m_entries.at(m_oldpanel)!= NULL && m_entries.at(m_oldpanel)->isA("CachingWidget")) ((CachingWidget*) m_entries.at(m_oldpanel))->setCached(false); if(m_entries.at(m_curpanel) != NULL && m_entries.at(m_curpanel)->isA("CachingWidget")) ((CachingWidget*) m_entries.at(m_curpanel))->setCached(false); }}int PanelSwitcher::visibleIndex() const { return m_curpanel;}QWidget* PanelSwitcher::visiblePanel() { return m_entries.at(m_curpanel);}QWidget* PanelSwitcher::panelAt(int index) { return m_entries.at(index);}void PanelSwitcher::addPanel(QWidget *panel, uint index) { for(uint i= 0; i < index; i++) if(i >= m_entries.count()) m_entries.append(NULL); m_entries.insert(index, panel); resizeContents(m_entries.count()* width(), height()); addChild(panel, index* width(), 0); panel->resize(width(), height()); panel->show();}void PanelSwitcher::resizeEvent(QResizeEvent *evt) { QScrollView::resizeEvent(evt); for(uint i= 0; i < m_entries.count(); i++) { if(m_entries.at(i) != NULL) m_entries.at(i)->setGeometry(i* width(), 0, width(), height()); } resizeContents(m_entries.count()* width(), height()); setContentsPos(m_curpanel* width(), 0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -