动态计算area位置

window.onresize = adjuest;
    function adjuest(){
        var picw = $(".imgbox img").width();
        var pich = $(".imgbox img").height();
   
        var x1 = parseInt(picw*0.82004);  // 
        var y1 = parseInt(pich*0.36380);  //
        var x2 = parseInt(picw*0.71700);
        var y2 = parseInt(pich*0.41714);
        var andx1 = parseInt(picw*0.67004);
        var andy1 = parseInt(pich*0.36380);
        var andx2 = parseInt(picw*0.56700);
        var andy2 = parseInt(pich*0.41714);
        $("#ios").attr("coords",'"'+x1+','+y1+','+x2+','+y2+'"')
        $("#android").attr("coords",'"'+andx1+','+andy1+','+andx2+','+andy2+'"')
    }
    adjuest(); 



 // 0.82004 = area的x点位置/img的width
其他的类似

<div class="imgbox img_box_4" img-index="4" style="display:none">
    <img src="__PUBLIC__/home/bsk/img/app_07.jpeg" alt="" usemap="#mymap">
    <map name="mymap" >
        <area id="ios" shape="rect" href="" coords="">
        <area id ="android" shape="rect" href="" coords="">
    </map>
</div>

 

转载于:https://www.cnblogs.com/wanghaonull/p/7098730.html

<think>我们使用QScrollArea时,有时需要控制滚动位置,比如滚动到特定位置、最底部或最顶部等。Qt提供了几种方法来设置滚动位置: ### 一、通过滚动条对象设置 最直接的方式是获取滚动条对象并设置其值: ```cpp // 获取垂直滚动条 QScrollBar *verticalBar = scrollArea->verticalScrollBar(); // 设置滚动位置(范围从最小值到最大值) verticalBar->setValue(targetPosition); // targetPosition是整数 // 获取水平滚动条 QScrollBar *horizontalBar = scrollArea->horizontalScrollBar(); horizontalBar->setValue(targetPosition); ``` ### 二、滚动到最底部或最顶部 ```cpp // 滚动到最底部 verticalBar->setValue(verticalBar->maximum()); // 滚动到最顶部 verticalBar->setValue(verticalBar->minimum()); ``` ### 三、滚动到子部件位置 如果需要滚动到某个子部件的位置,可以使用`ensureWidgetVisible`方法: ```cpp // 确保子部件可见(自动调整滚动位置) scrollArea->ensureWidgetVisible(childWidget, xMargin=50, yMargin=50); // 可选参数:xMargin和yMargin是边距(像素) ``` ### 四、滚动到相对位置(百分比) ```cpp // 滚动到垂直方向的50%位置 int vmax = verticalBar->maximum(); verticalBar->setValue(vmax * 0.5); // 水平方向同理 int hmax = horizontalBar->maximum(); horizontalBar->setValue(hmax * 0.3); ``` ### 五、平滑滚动动画 Qt 5.4+ 支持平滑滚动动画: ```cpp // 创建动画对象 QPropertyAnimation *animation = new QPropertyAnimation(verticalBar, "value"); animation->setDuration(500); // 动画时长(毫秒) animation->setStartValue(verticalBar->value()); animation->setEndValue(targetPosition); animation->setEasingCurve(QEasingCurve::OutQuad); // 缓动曲线 animation->start(QAbstractAnimation::DeleteWhenStopped); ``` ### 六、注意事项 1. **滚动条范围**:设置值前确保滚动条已初始化(最好在内容布局完成后调用) 2. **动态内容**:如果内容动态添加,需在添加后调用`updateGeometry()`或`adjustSize()`,再设置滚动位置 3. **坐标系统**:滚动条值使用像素单位,且与内容尺寸相关 ### 示例:聊天窗口自动滚动到底部 ```cpp // 添加新消息后 void addMessage(const QString &msg) { QLabel *label = new QLabel(msg, contentWidget); layout->addWidget(label); // 添加到内容布局 // 调整内容尺寸 contentWidget->adjustSize(); // 滚动到底部 QScrollBar *vbar = scrollArea->verticalScrollBar(); vbar->setValue(vbar->maximum()); } ``` ### 七、高级控制:自定义滚动区域 若需精细控制,可继承`QScrollArea`并重写: ```cpp void wheelEvent(QWheelEvent *e) override; // 鼠标滚轮事件 void keyPressEvent(QKeyEvent *e) override; // 键盘事件 ``` > 提示:使用`QScrollArea::ensureVisible(int x, int y, int xmargin, int ymargin)`可直接滚动到指定坐标点[^3]。 --- ### 相关问题 1. 如何获取QScrollArea当前的滚动位置? 2. 如何监听滚动位置变化? 3. 如何实现无限滚动加载? 4. QScrollArea中如何实现缩放功能? 5. 如何同步两个QScrollArea的滚动位置? [^1]: QScrollArea官方文档 [^2]: Qt控件示例《可滚动区域》 [^3]: Qt Assistant: "QAbstractScrollArea Class Reference"</think>### Qt QScrollArea 设置滚动位置的方法 在Qt中控制QScrollArea的滚动位置主要有以下几种方法,适用于不同场景的需求: #### 一、通过滚动条直接控制(最常用) ```cpp // 获取垂直滚动条 QScrollBar* vScroll = scrollArea->verticalScrollBar(); // 设置绝对位置(像素单位) vScroll->setValue(250); // 滚动到250像素位置 // 滚动到最底部 vScroll->setValue(vScroll->maximum()); // 滚动到最顶部 vScroll->setValue(vScroll->minimum()); // 相对当前位置滚动 vScroll->setValue(vScroll->value() + 100); // 向下滚动100像素 ``` #### 二、确保特定部件可见 ```cpp // 确保目标部件在视口中可见(自动计算滚动位置) scrollArea->ensureWidgetVisible(targetWidget); // 带边距的可见(xMargin, yMargin为像素) scrollArea->ensureWidgetVisible(targetWidget, 20, 20); ``` #### 三、滚动到指定坐标 ```cpp // 滚动到绝对坐标位置(视口坐标) scrollArea->ensureVisible(100, 300, // x, y坐标 50, 50); // xMargin, yMargin边距 ``` #### 四、使用动画平滑滚动(Qt 5.2+) ```cpp #include <QPropertyAnimation> // 创建动画对象 QPropertyAnimation* animation = new QPropertyAnimation( scrollArea->verticalScrollBar(), // 目标对象 "value", // 属性名 scrollArea); // 父对象 // 设置动画参数 animation->setDuration(500); // 动画时长(ms) animation->setStartValue(scrollArea->verticalScrollBar()->value()); animation->setEndValue(targetPosition); animation->setEasingCurve(QEasingCurve::OutQuad); // 缓动曲线 // 启动动画 animation->start(); ``` #### 五、百分比滚动 ```cpp // 滚动到垂直位置50% int scrollPos = scrollArea->verticalScrollBar()->maximum() * 0.5; scrollArea->verticalScrollBar()->setValue(scrollPos); ``` #### 六、监听滚动位置变化 ```cpp // 连接滚动条值变化信号 connect(scrollArea->verticalScrollBar(), &QScrollBar::valueChanged, [](int value) { qDebug() << "当前滚动位置:" << value; }); ``` ### 注意事项 1. **时机问题**:在内容完全加载后设置滚动位置,建议在`showEvent()`或布局完成后操作 2. **动态内容**:内容变化后需重新计算位置 ```cpp connect(contentWidget, &MyWidget::contentUpdated, [=](){ scrollArea->verticalScrollBar()->setValue(targetPos); }); ``` 3. **性能优化**:频繁操作时使用`blockSignals(true)`避免信号风暴 ```cpp scrollArea->verticalScrollBar()->blockSignals(true); // 批量滚动操作... scrollArea->verticalScrollBar()->blockSignals(false); ``` ### 示例:聊天窗口自动滚动 ```cpp void ChatWindow::addMessage(const QString& msg) { QLabel* newMsg = new QLabel(msg, contentWidget); layout->addWidget(newMsg); // 调整内容尺寸 contentWidget->adjustSize(); // 滚动到底部 QScrollBar* vbar = scrollArea->verticalScrollBar(); vbar->setValue(vbar->maximum()); } ``` > 关键原理:QScrollArea内部维护视口(viewport)和内容区域的关系,滚动操作本质是调整视口在内容区域中的位置[^1]。 --- ### 相关问题 1. 如何实现QScrollArea的无限滚动效果? 2. 如何同步两个QScrollArea的滚动位置? 3. QScrollArea中如何实现滚动到指定行号? 4. 如何自定义QScrollBar的滚动步长? 5. Qt中如何实现视差滚动效果? [^1]: Qt官方文档《QAbstractScrollArea Class Reference》 [^2]: Qt技术白皮书《GUI性能优化指南》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值