Qt之窗体拖拽、自适应分辨率、自适应大小

简述

在自定义无边框、标题栏的界面中,需要自己实现最小化、最大化、关闭、窗体背景等功能。最小化、最大化、关闭等按钮设计及功能比较简单,这里就不多做介绍。今天主要介绍一下绘制背景的问题,主要实现自适应屏幕分辨率。

  • 简述
  • 实现
    • 自适应方案
    • 效果
    • 源码

实现

先看一下UI设计的图(大小:1298*786):

自适应方案

如何自适应屏幕分辨率呢?下面是常用的一些方案:

  1. 为每个分辨率单独做一张图
  2. 将图片切分为九宫格形
  3. 在原图基础上进行实现

下面,我们分别对它们一一进行分析:

  1. 常用的分辨率很多,800*600、1024*768、1280*800、1680*1050等等。。。那么得需要多少张图呢?而且资源一旦过多,会加大程序开销。
  2. 需要将图片切分,而且如果切分不合适,还得来回重复切图,加大UI工作量。。。
  3. 在原图的基础上实现,在代码逻辑上处理!

综上所述:很明显,方案3是最好的,那么如何实现呢?请继续往下看!

由于界面存在缩放,所以如果窗体有圆角、或者存在阴影效果,缩放过程中会变形,所以需要进行特殊化处理!

  1. 左上角、左下角、右上角、右下角进行切分分别绘制(下面所说的切分都使用代码实现)
  2. 左、上、右、下部位进行切分,计算出窗体的大小后,在原方向进行拉伸
  3. 中央部分切分出一部分进行平铺
  4. 让UI将圆角及阴影部分标注出来,这里需要标注宽和高,以便于实现切图。

效果

源码

现在,来开始我们的代码之旅吧!

void paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    QPixmap background(":/background");

    int nLeftWidth = 144;
    int nBottomHeight = 24;
    int nTopHeight = 67;

    // 分别计算左、上、右、下的区域
    QRect left(0, 100, nLeftWidth, 100);
    QRect right(background.width() - nLeftWidth, 100, nLeftWidth, 100);
    QRect leftTop(0, 0, nLeftWidth, nTopHeight);
    QRect rightTop(background.width() - nLeftWidth, 0, nLeftWidth, nTopHeight);
    QRect top(150, 0, 150, nTopHeight);
    QRect leftBottom(0, background.height() - nBottomHeight, nLeftWidth, nBottomHeight);
    QRect rightBottom(background.width() - nLeftWidth, background.height() - nBottomHeight, nLeftWidth, nBottomHeight);
    QRect bottom(150, background.height() - nBottomHeight, 100, nBottomHeight);
    QRect center(300, 300, 100, 100);

    QRect leftRect(0, nTopHeight, nLeftWidth, this->height() - nTopHeight - nBottomHeight);
    QRect rightRect(this->width() - nLeftWidth, nTopHeight, nLeftWidth, this->height() - nTopHeight - nBottomHeight);
    QRect leftTopRect(0, 0, nLeftWidth, nTopHeight);
    QRect rightTopRect(this->width() - nLeftWidth, 0, nLeftWidth, nTopHeight);
    QRect topRect(nLeftWidth, 0, this->width() - nLeftWidth*2, nTopHeight);
    QRect leftBottomRect(0, this->height() - nBottomHeight, nLeftWidth, nBottomHeight);
    QRect righttBottomRect(this->width() - nLeftWidth, this->height() - nBottomHeight, nLeftWidth, nBottomHeight);
    QRect bottomRect(nLeftWidth, this->height() - nBottomHeight, this->width() - nLeftWidth*2, nBottomHeight);
    QRect centerRect(nLeftWidth, nTopHeight, this->width() - nLeftWidth*2, this->height() - nTopHeight - nBottomHeight);

    // 绘制图片
    painter.drawPixmap(topRect, background, top);
    painter.drawPixmap(leftRect, background, left);
    painter.drawPixmap(rightRect, background, right);
    painter.drawPixmap(rightTopRect, background, rightTop);
    painter.drawPixmap(leftTopRect, background, leftTop);
    painter.drawPixmap(leftBottomRect, background, leftBottom);
    painter.drawPixmap(righttBottomRect, background, rightBottom);
    painter.drawPixmap(bottomRect, background, bottom);
    painter.drawPixmap(centerRect, background, center);
}

关于缩放处理,请参考:

时间: 2024-10-31 12:05:46

Qt之窗体拖拽、自适应分辨率、自适应大小的相关文章

JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)_javascript技巧

本文实例讲述了JS实现漂亮的窗口拖拽效果.分享给大家供大家参考.具体如下: 这是一款漂亮的JS窗口拖拽效果(改变大小/最小化/最大化/还原/关闭) 特点: ① 窗口可以拖动: ② 窗口可以通过八个方向改变大小: ③ 窗口可以最小化.最大化.还原.关闭: ④ 限制窗口最小宽度/高度. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-win-drug-cha-close-demo/ 具体代码如下: <!DOCTYPE html PUBLIC &qu

C#中势将窗体拖拽进行到底

问题描述:  想在.Net下实现对一些非规则窗体,没有Caption,FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;窗体的拖拽,最小化,最大化,特殊操作的实现(如图1所示).在黄色的区域即区域1里实现对窗体的拖拽操作,在橙色区域即区域2里实现对窗体的最小化操作,在蓝色区域即区域3里实现对窗体的关闭操作,在绿色区域即区域4里实现对窗体的特殊操作(如双倍窗体).    (图1)  问题实现: 第一种方法:添加Label为Lab

C# Winform的自适应分辨率的类

在做YH的时候,为了扩展界面的功能区域,使得更为方便的使用系统,所以对界面的大小进行了扩充.随之而来的分辨率问题也就来了.功能写完了,但是现在又在原来的界面上显示不全.改回去太麻烦了,只好写了一个自适应分辨率的类,来解决这一问题. 多的不说了,直接上代码吧. using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; class AutoSizeForm { /

鼠标拖拽移动子窗体的JS实现

 这篇文章主要介绍了鼠标拖拽移动子窗体的JS实现,需要的朋友可以参考下 1.子窗体   在设计网站的时候,我们需要设计一些模态的子窗体,比如     这一步很容易实现,只需要div+css就ok了,请看代码:    代码如下:     <div class="modal-background"></div>     <div class="modal-window">         <div class="hea

关于自适应分辨率的问题,在线等

问题描述 问题是这样我在网上看到了孟子的一个帖子:问道如何自适应分辨率:答案是这样的<script>functiontest(){if(1024==screen.width)window.showModalDialog('Main.aspx',"testwindow","dialogHeight:768px;dialogWidth:1024px;");elseif(800==screen.width)window.showModalDialog('Mai

Qt 按一次滚动条就可以拖拽,再按一次就释放。怎么实现?

问题描述 Qt 按一次滚动条就可以拖拽,再按一次就释放.怎么实现? 40C Qt 按一次滚动条就可以拖拽,再按一次就释放.不需要像常规滚动条需要一直按住鼠标左键.怎么实现? 解决方案 不知道QT如何,Windows下可以捕捉控件消息,然后设定一个状态,MouseDown的时候,先判定这个状态如果为true那么设置为False,之后的鼠标移动操作不做任何处理,否则设置为true那么以后鼠标的任何位置移动就发送WMMouseWheel鼠标滚动消息,或者说自己调用滚动条的滚动消息WM_VScrollW

window-js判断屏幕分辨率 自适应

问题描述 js判断屏幕分辨率 自适应 function switchClass(){ if($(window).width()<1200){ $('.middle').removeClass('page_xs ').removeClass('page_sm').addClass('page_lg'); }else if($(window).height()<272){ $('.middle').removeClass('page_lg').removeClass('page_sm').addC

jquery 可拖拽的窗体控件实现代码_jquery

所以要引入JQUERY框架. 把我的这个控件代码放到一个js文件里面直接引入就可以了 控件代码 复制代码 代码如下: $.fn.myDrag = function() { var self = $(this); self.css("position", "absolute"); var p = self.position(); self.css({ left: p.left, top: p.top }); self.mousedown( function(event

鼠标拖拽移动子窗体的JS实现_javascript技巧

1.子窗体 在设计网站的时候,我们需要设计一些模态的子窗体,比如 这一步很容易实现,只需要div+css就ok了,请看代码: 复制代码 代码如下:     <div class="modal-background"></div>    <div class="modal-window">        <div class="head">            <center>点住着块区