쓰기 컨트롤 속성 Qt는 디자이너 3 스트레치 제어

I. 서론

부하 제어 플러그, 드래그 컨트롤도 달성, 다음 단계는 가장 어려움 중 하나입니다, 같은 QtDesigner 또는 다른 개발 환경으로, 우리는이 기능을 자유롭게 신축 할 수 제어 크기, 모바일 위치였다뿐만 아니라에 대한 특별한 제어 준비 플롯 점 입력 제어, 마우스의 위치를 자동으로 식별 따라 제어부의 제어를 생성 할 때이 기능을 달성하기 위해, 이름 SelectWidget 플롯 점 원칙적 이벤트 필터를 설치하는 것, 형상 제어를 수행 눌러 제어를 변경 끌려나 크기, 연신의 사용을 설명하기 위해 사용자의 시점 식별자를 플롯.
플롯 포인트를 그릴 여부를 설정할 컨트롤을 다음 플롯 포인트, 여백, 플롯 컬러 포인트, 도트 크기를 설명, 플롯 포인트가 둥근 사각형 +를 형성, 창을 이동 양식을 삭제하려면 Delete 키를 지원하기 위해 테두리 너비, 지원 위 아래로 버튼을 선택, 팔 개 추적 지점이 창을 변경 지원 몸 크기.
경험 주소 : https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 추출 코드 : 877p 파일 : 실행 파일의 .zip

기능 둘째, 실현

  1. 모든 컨트롤은 자동으로 플러그인이 목록 파일, 120 개 이상의 기본 내장 된 컨트롤을 생성로드합니다.
  2. 캔버스가 자동으로, WYSIWYG를 해당 컨트롤을 생성 끕니다.
  3. 바의 중국어 재산권이 해당 속성 즉각 간단하고 직관적 인 흰색 사용에 매우 적합 해당 선택된 제어에 적용되는 변경.
  4. 원본 텍스트 번역 속성 필드 매핑 메커니즘, 높은 효율, 당신은 쉽게 속성 표시 줄 다른 언어를 확장 할 수 있습니다.
  5. 자동 드롭 다운 상자 계수치 등을 포함하는 오른쪽 컬럼에 나타낸 모든 제어 및 속성의 속성을 추출.
  6. 지원 수동으로 플러그인 파일 가져 오기 플러그인 외부 파일을 선택합니다.
  7. 모든 컨트롤은 현재 캔버스 구성 정보는 XML 파일로 내보낼 수 있습니다.
  8. 수동으로 XML 파일을 기반으로 XML 파일을 열고 레이아웃 제어, 자동 부하 제어를 선택할 수 있습니다.
  9. 상자 아날로그 데이터, 텍스트 입력 상자, 슬라이더를 끌어 확인할 수 있습니다, 세 가지의 데이터 응용 프로그램은 모든 컨트롤을 생성합니다.
  10. 제어는 8 개 방향 오른쪽 어떤 해상도로, 크기를 조정 적응을 당겨 키보드의 상하 위치를 미세 조정할 수 있습니다 왼쪽으로 지원합니다.
  11. 그들은 세 가지 방법으로 수집 된 네트워크, 데이터베이스 데이터 세트를 수집, 시리얼 수집을 열었다.
  12. 코드는 매우 상세한 사항은, 자신의 더 많은 기능을 개발, 프로토 타입으로 아주 간결하게 구성 할 수있다.
  13. 순수한 Qt는 작성된, Qt는 컴파일러 + 모든 + 모든 시스템의 모든 버전을 지원합니다.

셋째, 렌더링

넷째, 핵심 코드

bool SelectWidget::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == widget) {
        if (event->type() == QEvent::Resize) {
            //设置当前窗体大小为跟随窗体的大小增加部分
            this->resize(this->widget->size() + QSize(padding * 2, padding * 2));
        } else if (event->type() == QEvent::Move) {
            //将当前窗体移到偏移位置
            this->move(this->widget->pos() - QPoint(padding, padding));
        }
    } else {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>(event);
            if (keyEvent->key() == Qt::Key_Left) {
                this->move(this->pos() - QPoint(1, 0));
            } else if (keyEvent->key() == Qt::Key_Right) {
                this->move(this->pos() + QPoint(1, 0));
            } else if (keyEvent->key() == Qt::Key_Up) {
                this->move(this->pos() - QPoint(0, 1));
            } else if (keyEvent->key() == Qt::Key_Down) {
                this->move(this->pos() + QPoint(0, 1));
            } else if (keyEvent->key() == Qt::Key_Delete) {
                emit widgetDelete(widget);
                widget->deleteLater();
                this->deleteLater();
                widget = 0;
            }

            //重新设置附带窗体的位置和大小
            if (widget != 0) {
                widget->setGeometry(this->x() + padding, this->y() + padding, this->width() - padding * 2, this->height() - padding * 2);
            }

            return QWidget::eventFilter(watched, event);
        }

        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        if (mouseEvent->type() == QEvent::MouseButtonPress) {
            //记住当前控件坐标和宽高以及鼠标按下的坐标
            rectX = this->x();
            rectY = this->y();
            rectW = this->width();
            rectH = this->height();
            lastPos = mouseEvent->pos();

            //判断按下的手柄的区域位置
            if (rectLeft.contains(lastPos)) {
                pressedLeft = true;
            } else if (rectRight.contains(lastPos)) {
                pressedRight = true;
            } else if (rectTop.contains(lastPos)) {
                pressedTop = true;
            } else if (rectBottom.contains(lastPos)) {
                pressedBottom = true;
            } else if (rectLeftTop.contains(lastPos)) {
                pressedLeftTop = true;
            } else if (rectRightTop.contains(lastPos)) {
                pressedRightTop = true;
            } else if (rectLeftBottom.contains(lastPos)) {
                pressedLeftBottom = true;
            } else if (rectRightBottom.contains(lastPos)) {
                pressedRightBottom = true;
            } else {
                pressed = true;
            }

            if (widget != 0) {
                emit widgetPressed(widget);
            }
        } else if (mouseEvent->type() == QEvent::MouseMove) {
            //根据当前鼠标位置,计算XY轴移动了多少
            QPoint pos = mouseEvent->pos();
            int dx = pos.x() - lastPos.x();
            int dy = pos.y() - lastPos.y();

            //根据按下处的位置判断是否是移动控件还是拉伸控件
            if (pressed) {
                this->move(this->x() + dx, this->y() + dy);
            } else if (pressedLeft) {
                int resizeW = this->width() - dx;
                if (this->minimumWidth() <= resizeW) {
                    this->setGeometry(this->x() + dx, rectY, resizeW, rectH);
                }
            } else if (pressedRight) {
                this->setGeometry(rectX, rectY, rectW + dx, rectH);
            } else if (pressedTop) {
                int resizeH = this->height() - dy;
                if (this->minimumHeight() <= resizeH) {
                    this->setGeometry(rectX, this->y() + dy, rectW, resizeH);
                }
            } else if (pressedBottom) {
                this->setGeometry(rectX, rectY, rectW, rectH + dy);
            } else if (pressedLeftTop) {
                int resizeW = this->width() - dx;
                int resizeH = this->height() - dy;
                if (this->minimumWidth() <= resizeW) {
                    this->setGeometry(this->x() + dx, this->y(), resizeW, resizeH);
                }
                if (this->minimumHeight() <= resizeH) {
                    this->setGeometry(this->x(), this->y() + dy, resizeW, resizeH);
                }
            } else if (pressedRightTop) {
                int resizeW = rectW + dx;
                int resizeH = this->height() - dy;
                if (this->minimumHeight() <= resizeH) {
                    this->setGeometry(this->x(), this->y() + dy, resizeW, resizeH);
                }
            } else if (pressedLeftBottom) {
                int resizeW = this->width() - dx;
                int resizeH = rectH + dy;
                if (this->minimumWidth() <= resizeW) {
                    this->setGeometry(this->x() + dx, this->y(), resizeW, resizeH);
                }
                if (this->minimumHeight() <= resizeH) {
                    this->setGeometry(this->x(), this->y(), resizeW, resizeH);
                }
            } else if (pressedRightBottom) {
                int resizeW = rectW + dx;
                int resizeH = rectH + dy;
                this->setGeometry(this->x(), this->y(), resizeW, resizeH);
            }

            //重新设置附带窗体的位置和大小
            if (widget != 0) {
                widget->setGeometry(this->x() + padding, this->y() + padding, this->width() - padding * 2, this->height() - padding * 2);
            }
        } else if (mouseEvent->type() == QEvent::MouseButtonRelease) {
            pressed = false;
            pressedLeft = false;
            pressedRight = false;
            pressedTop = false;
            pressedBottom = false;
            pressedLeftTop = false;
            pressedRightTop = false;
            pressedLeftBottom = false;
            pressedRightBottom = false;

            if (widget != 0) {
                emit widgetRelease(widget);
            }
        }
    }

    return QWidget::eventFilter(watched, event);
}

void SelectWidget::resizeEvent(QResizeEvent *)
{
    //重新计算八个描点的区域,描点区域的作用还有就是计算鼠标坐标是否在某一个区域内
    int width = this->width();
    int height = this->height();

    //左侧描点区域
    rectLeft = QRectF(0, height / 2 - pointSize / 2, pointSize, pointSize);
    //上侧描点区域
    rectTop = QRectF(width / 2 - pointSize / 2, 0, pointSize, pointSize);
    //右侧描点区域
    rectRight = QRectF(width - pointSize, height / 2 - pointSize / 2, pointSize, pointSize);
    //下侧描点区域
    rectBottom = QRectF(width / 2 - pointSize / 2, height - pointSize, pointSize, pointSize);

    //左上角描点区域
    rectLeftTop = QRectF(0, 0, pointSize, pointSize);
    //右上角描点区域
    rectRightTop = QRectF(width - pointSize, 0, pointSize, pointSize);
    //左下角描点区域
    rectLeftBottom = QRectF(0, height - pointSize, pointSize, pointSize);
    //右下角描点区域
    rectRightBottom = QRectF(width - pointSize, height - pointSize, pointSize, pointSize);
}

void SelectWidget::mouseMoveEvent(QMouseEvent *e)
{
    //计算当前鼠标位置是否在某个区域内,自动更新鼠标形状
    QPoint p = e->pos();
    if (rectLeft.contains(p)) {
        this->setCursor(Qt::SizeHorCursor);
    } else if (rectTop.contains(p)) {
        this->setCursor(Qt::SizeVerCursor);
    } else if (rectRight.contains(p)) {
        this->setCursor(Qt::SizeHorCursor);
    } else if (rectBottom.contains(p)) {
        this->setCursor(Qt::SizeVerCursor);
    } else if (rectLeftTop.contains(p)) {
        this->setCursor(Qt::SizeFDiagCursor);
    } else if (rectRightTop.contains(p)) {
        this->setCursor(Qt::SizeBDiagCursor);
    } else if (rectLeftBottom.contains(p)) {
        this->setCursor(Qt::SizeBDiagCursor);
    } else if (rectRightBottom.contains(p)) {
        this->setCursor(Qt::SizeFDiagCursor);
    } else {
        this->setCursor(Qt::ArrowCursor);
    }
}

다섯째, 컨트롤 소개

  1. 150 개 이상의 정교한 제어가 대시 보드의 종류, 진행 막대의 진행을 덮는 공, 나침반, 그래프, 저울, 온도계, 탐색 바, 탐색 바, flatui 등등 셀렉터 음력 및 슬라이드 버튼을 강조. 제어 통합의 수보다 Qwt 훨씬 더.
  2. 각 클래스는 별도의 제어 제로 결합 각 제어 파일 프로젝트 소스 코드 형태로 이하에 통합 된 개별적인 제어를 용이하게하는 다른 파일 독립적 부호 량을 달성하기 위해, 헤더 파일로 독립적 일 수있다. qwt 높은 결합 된 컨트롤 클래스를, 연동, 모든 코드를 포함해야합니다 컨트롤 중 하나를 사용하고 싶습니다.
  3. 모든 순수한 Qt를,는 QWidget + QPainter를가립니다 어떤 Qt는 버전 Qt4.6 Qt5.12 등와 Mingw, MSVC, GCC 컴파일러에 대한 지원을 지원하기 위해 쓰기와 같은 왜곡하지 않는 윈도우 + 리눅스 + 맥 + 임베디드 리눅스로 모든 운영 시스템을 지원 직접 Qt는 창조주, 내장 된 컨트롤에 통합 및이를 사용할 수 있고, 효과의 대부분은 한 여러 속성이 설정되므로 매우 편리 할 수 ​​있습니다.
  4. 각 컨트롤에 대응하는 제어를 포함하는 별도의 소스 DEMO 편리한 참조를 갖는다. 또한 모든 컨트롤 데모의 통합 사용을 제공합니다.
  5. 각 컨트롤에 대한 소스 코드는 중국 주석을 자세히 사용자 지정 컨트롤을 작성하는 배우기 쉽고, 통합 된 설계 사양에 따라 준비가되어있다.
  6. 각 컨트롤의 기본 색상 및 데모 해당 색상이 매우 아름답습니다.
  7. 130 개 이상의 표시 제어 여섯 개 보이지 제어.
  8. 부분 제어 스타일 스타일 선택, 객관식 스타일 표시의 다양한 제공합니다.
  9. 모든 컨트롤 변경 뻗어 양식을 적응 적.
  10. 드래그 설계를 지원하는 통합 디자인 사용자 지정 특성은, WYSIWYG XML 형식으로 가져 오기 및 내보내기를 지원합니다.
  11. 데모와 함께 제공 ActiveX 컨트롤은 모든 컨트롤은 브라우저 IE에서 직접 실행할 수 있습니다.
  12. Fontawesome 통합 그래픽 글꼴 + 그래픽 글꼴의 수백 알리바바 iconfont 수집, 글꼴 재미 그래픽 제공합니다.
  13. 모든 컨트롤 그리고 마지막으로는 동적 라이브러리 파일 생성 (DLL을 정도 등)을 드래그에서 사용하도록 설계 qtcreator에 직접 통합 할 수 있습니다.
  14. 그런 다음 사용자가 수요의 경우 이미 QML 버전, 후자는 PyQt는 버전을 고려할 것입니다.
  15. 사용자 정의 개방 동적 라이브러리에 플러그인 (영구 무료), 어떠한 제한없이 뒷문, 사용의 용이성.
  16. qt5.12.3 msvc2017 32 + 64와 Mingw를 32 + 64을 포함하는 26 구할 버전 DLL.
  17. 대한 통제를 강화하고 컨트롤을 개선하기 위해 수시로, 정기적으로 업데이트 SDK, 모든 제안을 환영하기 위해, 감사합니다!
  18. Qt를 소개 책 Qt5 프로그램 항목 ", Qt는 공식 고급 추천 도서"C ++ GUI QT4 프로그램 ""Qt는 창조주 빠른 시작 "의 Huo의 야 페이를 권장합니다."
  19. 추천 프로그래머 자기 훈련과 평생 혜택을 계획 ​​책 시리즈 "프로그래머의 성장 과정을"프로그래머 거짓말 "", "슬픔 프로그래머"!
  20. SDK 다운로드 링크 : https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 추출 코드 : 877p

추천

출처www.cnblogs.com/feiyangqingyun/p/11498292.html