<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在實際的應用場景中,經常會出現軟體介面戰場圖大於實際表單大小,利用QScrollArea可以為widget表單新增卷軸,可以實現小表單利用卷軸顯示大介面需求。實現如下:
QT建立一個qWidget介面
在ui介面中利用QT自帶的widget控制元件佈局一個如下圖所示的層疊關係,widget_2介面大小需大於widget大小
介面佈局好後,將widget_2提升為類,提升之前需為工程新新增一個設計介面類,新增完之後,將widget_2提升為類類名和前面新新增的設計介面類名一致
原始碼實現如下
patchwindow.h
#ifndef PATCHWINDOW_H #define PATCHWINDOW_H #include <QDebug> #include <QPainter> #include <QWidget> #include <QMouseEvent> #include <QStyleOption> #include <QPaintEvent> enum CursorRegion{ NONE, TOPLEFT, TOPRIGHT, BOTTOMRIGHT, BOTTOMLEFT }; namespace Ui { class Patchwindow; } class Patchwindow : public QWidget { Q_OBJECT public: explicit Patchwindow(QWidget *parent = 0); ~Patchwindow(); CursorRegion getCursorRegion(QPoint); public: int borderWidth; int handleSize; bool mousePressed; QPoint previousPos; private: Ui::Patchwindow *ui; protected: void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); signals: void send_widget_rx_ry(int rx,int ry); }; #endif // PATCHWINDOW_H
patchwindow.cpp
#include "patchwindow.h" #include "ui_patchwindow.h" Patchwindow::Patchwindow(QWidget *parent) : QWidget(parent), ui(new Ui::Patchwindow) { ui->setupUi(this); this->setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); mousePressed = false; borderWidth = 1; handleSize = 8; } Patchwindow::~Patchwindow() { delete ui; } //設定滑鼠形狀 CursorRegion Patchwindow::getCursorRegion(QPoint pos) { if (pos.x() > 0 && pos.x() < (handleSize + borderWidth) && pos.y() > 0 && pos.y() < (handleSize + borderWidth) ){ if (this->hasFocus()) this->setCursor(QCursor(Qt::SizeFDiagCursor)); return CursorRegion::TOPLEFT; } if (pos.x() > (this->width() - handleSize - borderWidth) && pos.x() < this->width() && pos.y() > 0 && pos.y() < (handleSize + borderWidth) ){ if (this->hasFocus()) this->setCursor(QCursor(Qt::SizeBDiagCursor)); return CursorRegion::TOPRIGHT; } if (pos.x() > (this->width() - handleSize - borderWidth) && pos.x() < this->width() && pos.y() > (this->height() - handleSize - borderWidth) && pos.y() < this->height() ){ if (this->hasFocus()) this->setCursor(QCursor(Qt::SizeFDiagCursor)); return CursorRegion::BOTTOMRIGHT; } if (pos.x() > 0 && pos.x() < (handleSize + borderWidth) && pos.y() > (this->height() - handleSize - borderWidth) && pos.y() < this->height() ){ if (this->hasFocus()) this->setCursor(QCursor(Qt::SizeBDiagCursor)); return CursorRegion::BOTTOMLEFT; } this->setCursor(Qt::ArrowCursor); return CursorRegion::NONE; } void Patchwindow::mousePressEvent(QMouseEvent *event) { mousePressed = true; previousPos = this->mapToParent(event->pos()); //qDebug()<<"previousPos = "<<previousPos; } void Patchwindow::mouseReleaseEvent(QMouseEvent*) { mousePressed = false; } void Patchwindow::mouseMoveEvent(QMouseEvent *event) { if (mousePressed){ QPoint _curPos = this->mapToParent(event->pos()); QPoint _offPos = _curPos - previousPos; previousPos = _curPos; //qDebug()<<"_offPos = "<<_offPos; //qDebug()<<"_curPos = "<<_curPos; emit send_widget_rx_ry(_offPos.rx(),_offPos.ry()); } }
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QHBoxLayout> #include <QDebug> #include <QScrollArea> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QScrollArea *m_pScroll; private: Ui::MainWindow *ui; private slots: void remove_widget(int r_x,int r_y); }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPalette> #include <QScrollBar> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //this->resize(600,600); //給父表單填充顏色 QPalette palette = ui->widget_2->palette(); palette.setBrush(QPalette::Window,QBrush(QColor(61,61,61))); ui->widget_2->setAutoFillBackground(true); ui->widget_2->setPalette(palette); ui->widget_2->setAttribute(Qt::WA_StyledBackground); ui->widget_2->setStyleSheet("QWidget{background: black}"); ui->widget_3->setAttribute(Qt::WA_TransparentForMouseEvents, true);//設定該層滑鼠事件透明,可以設定為顯示層 m_pScroll = new QScrollArea(ui->widget); m_pScroll->setWidget(ui->widget_2);//給widget_2設定卷軸 //ui->widget_2->setMinimumSize(1500,1000);//這裡注意,要比主表單的尺寸要大,不然太小的話會留下一片空白 QHBoxLayout *pLayout = new QHBoxLayout; pLayout->addWidget(m_pScroll); pLayout->setMargin(0); pLayout->setSpacing(0); ui->widget->setLayout(pLayout); connect(ui->widget_2,&Patchwindow::send_widget_rx_ry,this,&MainWindow::remove_widget); } MainWindow::~MainWindow() { delete ui; } void MainWindow::remove_widget(int r_x,int r_y) { r_y = m_pScroll->verticalScrollBar()->value()-r_y; r_x = m_pScroll->horizontalScrollBar()->value()-r_x; if((0 < r_y) | (r_y == 0)) { if(r_y > m_pScroll->verticalScrollBar()->maximum()) { r_y = m_pScroll->verticalScrollBar()->maximum(); } } else { r_y = 0; } if((0 < r_x) | (r_x == 0)) { if(r_x > m_pScroll->horizontalScrollBar()->maximum()) { r_x = m_pScroll->horizontalScrollBar()->maximum(); } } else { r_x = 0; } m_pScroll->verticalScrollBar()->setValue(r_y); m_pScroll->horizontalScrollBar()->setValue(r_x); }
最終實現效果如下,可以通過滾輪捲動介面,也可以通過滑鼠拖拽來實現介面拖拽效果:
到此這篇關於Qt基於QScrollArea實現介面巢狀移動的文章就介紹到這了,更多相關Qt QScrollArea介面巢狀移動內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45