1.效果展示
在一个窗口上添加一个浮动的半透明树形编辑框,并且可以拖动这个这个树形编辑框,双击透明界面关闭,先看效果:
2.自定义一个树形控件
#pragma once
#include <QTreeWidget>
#include <QPoint>
//计算结果输出树
class QWidget;
class PrintCalResultTree : public QTreeWidget {
Q_OBJECT
public:
PrintCalResultTree(QWidget *parent);
~PrintCalResultTree();
void setParentTitleHeight(int h);
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
void mouseDoubleClickEvent(QMouseEvent *event)override;
private:
QWidget* _parentWgt = nullptr;
int _parentTitleHeight = 0;//父标题栏的高度
QPoint _wndPos, _mousePos, _dPos, _mouseInTreePos;;
};
#include "PrintCalResultTree.h"
#include <QWidget>
#include <QMouseEvent>
PrintCalResultTree::PrintCalResultTree(QWidget *parent)
: QTreeWidget(parent) {
_parentWgt = parent;
setWindowOpacity(0.5);
}
PrintCalResultTree::~PrintCalResultTree() {
}
void PrintCalResultTree::setParentTitleHeight(int h) {
_parentTitleHeight = h;
}
void PrintCalResultTree::mousePressEvent(QMouseEvent *event) {
_wndPos = pos();
_mouseInTreePos = event->pos();
_mousePos = event->globalPos();
_dPos = _mousePos - _wndPos;
_mouseInTreePos.setY(_mouseInTreePos.y() + _parentTitleHeight);
QTreeWidget::mousePressEvent(event);
}
void PrintCalResultTree::mouseMoveEvent(QMouseEvent *event) {
_mousePos = event->globalPos();
_dPos = _mousePos - _wndPos;
_wndPos = _wndPos + _dPos;
_parentWgt->move(_wndPos - _mouseInTreePos);
QTreeWidget::mouseMoveEvent(event);
}
void PrintCalResultTree::mouseDoubleClickEvent(QMouseEvent *event) {
_parentWgt->hide();
QTreeWidget::mouseDoubleClickEvent(event);
}
3.自定义一个QDialog并且添加这个树形控件
#pragma once
#include <QDialog>
#include "ui_QtGuiPrintResult.h"
class QMouseEvent;
class PrintCalResultTree;
class QtGuiPrintResult : public QDialog {
Q_OBJECT
public:
QtGuiPrintResult(QWidget *parent = Q_NULLPTR);
~QtGuiPrintResult();
private:
void init();
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
private:
Ui::QtGuiPrintResult ui;
PrintCalResultTree* _printCalResultTree = nullptr;
QPoint _wndPos, _mousePos, _dPos;
};
#include "QtGuiPrintResult.h"
#include <QMouseEvent>
#include "PrintCalResultTree.h"
QtGuiPrintResult::QtGuiPrintResult(QWidget *parent)
: QDialog(parent) {
ui.setupUi(this);
init();
}
QtGuiPrintResult::~QtGuiPrintResult() {
}
void QtGuiPrintResult::init() {
int titleHeight = style()->pixelMetric(QStyle::PM_TitleBarHeight);
_printCalResultTree =(PrintCalResultTree*) ui.treeWidget;
_printCalResultTree->setParentTitleHeight(titleHeight);
setWindowOpacity(0.5);//设置透明度
setWindowFlag(Qt::FramelessWindowHint);//去掉边框
}
void QtGuiPrintResult::mousePressEvent(QMouseEvent *event) {
_wndPos = pos();
_mousePos = event->globalPos();
_dPos = _mousePos - _wndPos;
}
void QtGuiPrintResult::mouseMoveEvent(QMouseEvent *event) {
move(event->globalPos() - _dPos);
}
4.界面
布局界面,并且提升QTreeWidget
5.调用
void MoveChildWgt::slotOpenChild() {
if (_guiPrintResult == nullptr){
_guiPrintResult = new QtGuiPrintResult(this);
}
_guiPrintResult->exec();
}
aaa