QRect所有方法功能(QT5.12)

本文深入探讨了QRect类的各种用法,包括构造矩形、调整大小、移动位置、获取坐标等操作,以及如何通过QRect进行矩形间的比较和运算。
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QDebug>

#include<QRect>
#include <QPoint>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   
   
    ui->setupUi(this);
    //QRect类使用整数在平面上精确定义一个矩形。
    QRect rc = QRect(100,100,200,150); //构造函数有几个重载
                                                             //输入左上角坐标和右下角坐标(QPoint)
                                                             //输入左上角坐标和一个QSize的对象表示尺寸
    qDebug()<<rc;   //QRect(100,100 200x150)  void QRect::adjust(int dx1, int dy1, int dx2, int dy2)
    rc.adjust(5,6,0,0);   //前两个参数直接修改左上角的值 即topLeft.x() + dx1,topLeft.y() + dy1
    qDebug()<<rc; //QRect(105,106 195x144) 矩形左上角被修改,但是右下角不变 所以矩形实际上缩小了
    rc.adjust(0,0,5,6); //后两个参数修改右下角坐标位置 将其平移和左上角一样的距离
    qDebug()<<rc;  //QRect(105,106 200x150)  右下角被扯大 面积变大
    QRect adjust = rc.adjusted(-10,-10,10,10);  //adjusted 不修改原本的矩形;返回一个新的矩形 adjust修改原本矩形
    qDebug()<<adjust;
    QRect num = QRect(10,10,150,200);

    qDebug()<<num.bottomLeft()<<num.bottomRight()<<num<
<think>好的,我需要帮助用户在Qt5.12中实现将QTableWidget选中的内容显示到QTextBrowser。根据用户之前的提问和我的回答,用户可能已经了解了一些基本步骤,但需要结合他们提供的引用内容进行调整。 首先,用户提到参考了引用[2],里面指出Qt5.12中一些过时的类,比如QDesktopWidget、QDirModel等。但当前的实现主要用QTableWidget和QTextBrowser,这两个组件应该没有过时,所以暂时不需要担心。不过需要确保代码中没有使用其他过时类。 然后引用[3]提到关于QWidgetList的item赋值问题,涉及setData()和QVariant的使用。这可能和用户表格中的自定义控件有关,比如QCheckBox或者其他自定义部件。用户之前的回答中已经处理了这种情况,通过cellWidget获取控件状态,比如复选框是否选中。这里需要注意在Qt5.12中,使用QCheckBox作为单元格部件是否仍然适用,以及是否需要使用元类型注册。根据引用[3],如果用户自定义类型需要存储在QVariant中,必须使用Q_DECLARE_METATYPE或qRegisterMetaType。但如果是标准Qt控件如QCheckBox,可能不需要,但需要正确获取其状态。 接下来,用户的需求是实现选中数据的显示,可能需要以下几个步骤: 1. 连接QTableWidget的选中信号到槽函数,比如itemSelectionChanged。 2. 在槽函数中获取所有选中的项,使用selectedItems()方法。 3. 组织这些项的数据,考虑行和列的顺序,可能需要按行号整理,确保同一行的不同列数据能合并显示。 4. 处理可能存在的自定义控件,例如QCheckBox,通过cellWidget获取并检查状态。 5. 将数据格式化为HTML表格,以便在QTextBrowser中显示。 需要注意的是,用户之前示例代码中的复选框处理部分是否正确,尤其是在Qt5.12环境下是否存在变化。例如,findChild(QCheckBox)是否仍然有效,或者是否需要其他方式来获取控件。 另外,引用[1]提到关于QTableView系列的文章,可能涉及视图模型的相关内容,但用户当前使用QTableWidget,属于基于项的视图,可能不需要涉及模型/视图的复杂部分,但如果有性能问题,可能需要考虑数据量大的优化,如使用QTextCursor分批插入,但用户当前示例中可能数据量不大,暂时不需要。 在代码实现中,需要确保以下几点: - 正确绑定信号和槽,确保选中项变化时触发更新。 - 处理不同列的数据,尤其是混合文本和控件的情况。 - 生成正确的HTML结构,以便QTextBrowser正确显示表格。 - 避免使用过时的方法或类,如检查是否有被弃用的函数。 可能的错误点包括:未正确获取cellWidget中的控件,导致复选框状态无法读取;HTML格式错误导致显示不正常;未处理多选行时的数据合并问题等。需要逐一检查这些部分,确保代码在Qt5.12下运行正常。 最后,根据用户提供的引用内容,确保代码符合Qt5.12的最佳实践,不使用已过时的类或方法,同时正确处理自定义数据类型的存储和显示。</think>在Qt5.12中实现$QTableWidget$选中内容显示到$QTextBrowser$,需特别注意过时类兼容性[^2]和数据存储规范[^3],以下是分步实现方案: ### 一、基础实现(支持文本与基础控件) ```cpp // 信号连接 connect(ui->tableWidget, &QTableWidget::itemSelectionChanged, this, &MainWindow::updateTextBrowser); void MainWindow::updateTextBrowser() { const QList<QTableWidgetItem*> selected = ui->tableWidget->selectedItems(); if(selected.isEmpty()) return; // 按行号整理数据(兼容多列选择) QMap<int, QStringList> rowData; foreach(QTableWidgetItem* item, selected) { const int row = item->row(); if(!rowData.contains(row)) { rowData[row] = QStringList(); rowData[row].resize(ui->tableWidget->columnCount()); } rowData[row][item->column()] = item->text(); } // 构建HTML表格 QString html = "<table border='1'><tr><th>行号</th><th>内容</th></tr>"; QMapIterator<int, QStringList> it(rowData); while(it.hasNext()) { it.next(); html += QString("<tr><td>Row %1</td><td>%2</td></tr>") .arg(it.key()+1) .arg(it.value().join(" | ")); } html += "</table>"; ui->textBrowser->setHtml(html); } ``` ### 二、增强实现(支持复选框控件) 针对包含$QCheckBox$的列(假设在第2列): ```cpp // 添加复选框到表格(示例) QCheckBox* chk = new QCheckBox("启用"); chk->setChecked(true); ui->tableWidget->setCellWidget(0, 1, chk); // 第0行第1列 // 修改数据处理部分 foreach(QTableWidgetItem* item, selected) { const int row = item->row(); const int col = item->column(); // 处理特殊列(如第1列为QCheckBox) if(col == 1) { QCheckBox* cb = qobject_cast<QCheckBox*>(ui->tableWidget->cellWidget(row, col)); rowData[row][col] = cb && cb->isChecked() ? "✅ 启用" : "❌ 禁用"; } else { rowData[row][col] = item->text(); } } ``` ### 三、关键注意事项 1. **过时类规避** 避免使用引用[2]中列出的$QDesktopWidget$等过时类,改用$QScreen$获取屏幕信息: ```cpp QRect screenRect = QGuiApplication::primaryScreen()->geometry(); ``` 2. **自定义数据类型处理** 如需在表格项中存储对象(如引用[3]所述),需按规范注册元类型: ```cpp // 在头文件中声明 Q_DECLARE_METATYPE(MyCustomType) // 初始化时注册 qRegisterMetaType<MyCustomType>("MyCustomType"); // 数据存取 QTableWidgetItem* item = new QTableWidgetItem(); item->setData(Qt::UserRole, QVariant::fromValue(customObj)); ``` 3. **性能优化技巧** 当处理超过1000行数据时: ```cpp ui->textBrowser->setUpdatesEnabled(false); // 暂停渲染 // ...数据处理... ui->textBrowser->setUpdatesEnabled(true); // 恢复渲染 ``` ### 四、效果演示 实现结果将显示带边框的HTML表格,其中: - 复选框列会显示✅/❌状态图标 - 自动合并同一行的多列选择 - 行号从1开始计数(符合用户习惯) ![运行效果示意图](https://via.placeholder.com/600x400?text=Table+Selection+Display+Demo)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值