1. 关于是使用QList还是QVector的问题,一直是众多Qter的选择问题,主要是这两个玩意提供的的接口函数基本一致,比如插入、删除、取值等。
  • 大多数情况下可以用QList。像append、prepend、insert这种操作,通常QList比QVector快的多。
  • QList是基于index标签存储它的元素项在内存中,比那种依赖iterator迭代的更快捷,而且你的代码也更少。
  • 如果你需要一个真正的连接着的list,且需要保证一个固定插入耗时。那就用迭代器,而不是标签。使用QLinkedList()。
  • 如果你需要开辟连续的内存空间存储,或者你的元素远比一个指针大,这时你需要避免个别插入操作,出现堆栈溢出,这时候用QVector。
  • 如果更在意取值的速度则用QVector,QCustomPlot用的就是QVector,需要频繁大量的取出数据进行绘制。
  • 如果更在意更新数据(添加、删除等)的速度则用QList,就因为QChart用的是QList存取数据,也是导致大数据量卡顿的原因之一,一直被诟病。
  • 在数据量很小的情况下两者几乎没啥性能区别。
  • 貌似Qt6对这两个类合并了(选择困难症的Qter解放了),QVector=QList即QVector是QList的别名,可能底层改了代码以便发挥两者的优势。
  1. 关于mouseTracking鼠标追踪和tabletTracking平板追踪的几点官方说明。
  • mouseTracking属性用于保存是否启用鼠标跟踪,缺省情况是不启用的。
  • 没启用的情况下,对应部件只接收在鼠标移动同时至少一个鼠标按键按下时的鼠标移动事件。
  • 启用鼠标跟踪的情况下,任何鼠标移动事件部件都会接收。
  • 部件方法hasMouseTracking()用于返回当前是否启用鼠标跟踪。
  • setMouseTracking(bool enable)用于设置是否启用鼠标跟踪。
  • 与鼠标跟踪相关的函数主要是mouseMoveEvent()。
  • tabletTracking属性保存是否启用部件的平板跟踪,缺省是不起用的。
  • 没有启用平板跟踪的情况下,部件仅接收触控笔与平板接触或至少有个触控笔按键按下时的触控笔移动事件。
  • 如果部件启用了平板跟踪功能,部件能接收触控笔靠近但未真正接触平板时的触控笔移动事件。
  • 这可以用于监视操作位置以及部件的辅助操作功能(如旋转和倾斜),并为图形界面提供这些操作的信息接口。
  • 部件方法hasTabletTracking()用于返回当前是否启用平板跟踪。
  • setTabletTracking(bool enable)用于设置是否启用平板跟踪。
  • 与平板跟踪相关的函数主要是tabletEvent()。
  1. 关于QTableWidget等控件调用自带的removeRow、clearContents、clear函数删除了里面的item和内容,会自动调用item或者cellwidget的析构函数进行资源释放,不用自己手动再去释放。
//每次调用 clearContents 都会自动清理之前的item
ui->tableWidget->clearContents();
for (int i = 0; i < count; ++i) {
ui->tableWidget->setItem(i, 0, new QTableWidgetItem("aaa"));
ui->tableWidget->setItem(i, 1, new QTableWidgetItem("bbb"));
ui->tableWidget->setCellWidget(i, 2, new QPushButton("ccc"));
}
  1. 对于QListView(QListWidget)、QTreeView(QTreeWidget)、QTableView(QTableWidget)这种类型的控件,可以通过setChecked来让对应的item产生复选框效果,很多人(包括曾经的自己)误以为这就是复选框控件,其实不是的,他是对应控件的indicator指示器,所以想要更换样式,不能说设置了QCheckBox的样式就有效果,而要单独对齐indicator指示器设置样式才行。
QCheckBox::indicator,QGroupBox::indicator,QTreeWidget::indicator,QListWidget::indicator{
width:13px;
height:13px;
} QCheckBox::indicator:unchecked,QGroupBox::indicator:unchecked,QTreeWidget::indicator:unchecked,QListWidget::indicator:unchecked{
image:url(:/qss/flatwhite/checkbox_unchecked.png);
} QCheckBox::indicator:unchecked:disabled,QGroupBox::indicator:unchecked:disabled,QTreeWidget::indicator:unchecked:disabled,QListWidget::indicator:disabled{
image:url(:/qss/flatwhite/checkbox_unchecked_disable.png);
} QCheckBox::indicator:checked,QGroupBox::indicator:checked,QTreeWidget::indicator:checked,QListWidget::indicator:checked{
image:url(:/qss/flatwhite/checkbox_checked.png);
} QCheckBox::indicator:checked:disabled,QGroupBox::indicator:checked:disabled,QTreeWidget::indicator:checked:disabled,QListWidget::indicator:checked:disabled{
image:url(:/qss/flatwhite/checkbox_checked_disable.png);
} QCheckBox::indicator:indeterminate,QGroupBox::indicator:indeterminate,QTreeWidget::indicator:indeterminate,QListWidget::indicator:indeterminate{
image:url(:/qss/flatwhite/checkbox_parcial.png);
} QCheckBox::indicator:indeterminate:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeWidget::indicator:indeterminate:disabled,QListWidget::indicator:indeterminate:disabled{
image:url(:/qss/flatwhite/checkbox_parcial_disable.png);
}
  1. 关于QTableView(采用model数据源)、QTableWidget列名列宽设置,有时候发现没有起作用,原来是对代码设置的顺序有要求,比如setColumnWidth前必须先setColumnCount,不然列数都没有,哪来的列宽,包括setHorizontalHeaderLabels设置列标题集合也是,前提都要先有列。
void frmSimple::initForm()
{
row = 100;
column = 6;
model = new QStandardItemModel(this); columnNames << "列标题1" << "列标题2" << "列标题3" << "列标题4" << "列标题5" << "列标题6";
columnWidths << 100 << 100 << 100 << 100 << 100 << 100;
} void frmSimple::initTableView()
{
//清空数据
model->clear();
//先设置数据模型,否则 setColumnWidth 不起作用
ui->tableView->setModel(model); //设置列数及列标题和列宽
model->setColumnCount(column);
for (int i = 0; i < column; ++i) {
model->setHeaderData(i, Qt::Horizontal, columnNames.at(i));
ui->tableView->setColumnWidth(i, columnWidths.at(i));
} //循环添加行数据
for (int i = 0; i < row; ++i) {
//循环添加一行的列
QList<QStandardItem *> items;
for (int j = 0; j < column; ++j) {
QStandardItem *item = new QStandardItem;
//最后一列显示时间区别开来
if (j == column - 1) {
QDateTime now = QDateTime::currentDateTime().addSecs(i);
item->setText(now.toString("yyyy-MM-dd HH:mm:ss"));
} else {
item->setText(QString("行%1_列%2").arg(i + 1).arg(j + 1));
}
items << item;
}
model->appendRow(items);
}
} void frmSimple::initTableWidget()
{
//清空数据
ui->tableWidget->clearContents(); //设置列标题和列数及列宽
ui->tableWidget->setColumnCount(column);
ui->tableWidget->setHorizontalHeaderLabels(columnNames);
for (int i = 0; i < column; ++i) {
ui->tableWidget->setColumnWidth(i, columnWidths.at(i));
} //添加数据
ui->tableWidget->setRowCount(row);
for (int i = 0; i < row; ++i) {
for (int j = 0; j < column; ++j) {
QTableWidgetItem *item = new QTableWidgetItem;
//最后一列显示时间区别开来
if (j == column - 1) {
QDateTime now = QDateTime::currentDateTime().addSecs(i);
item->setText(now.toString("yyyy-MM-dd HH:mm:ss"));
} else {
item->setText(QString("行%1_列%2").arg(i + 1).arg(j + 1));
}
ui->tableWidget->setItem(i, j, item);
}
}
}

Qt开发经验小技巧186-190的更多相关文章

  1. Qt开发经验小技巧81-90

    Qt中的QColor对颜色封装的很完美,支持各种转换,比如rgb.hsb.cmy.hsl,对应的是toRgb.toHsv.toCmyk.toHsl,还支持透明度设置,颜色值还能转成16进制格式显示. ...

  2. Qt开发经验小技巧61-70

    很多人问Qt嵌入式平台用哪个好,这里统一回答(当前时间节点2018年):imx6+335x比较稳定,性能高就用RK3288 RK3399,便宜的话就用全志H3,玩一玩可以用树莓派香橙派. 对于大段的注 ...

  3. Qt开发经验小技巧41-50

    如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ...

  4. Qt开发经验小技巧71-80

    在我们使用QList.QStringList.QByteArray等链表或者数组的过程中,如果只需要取值,而不是赋值,强烈建议使用 at() 取值而不是 [] 操作符,在官方书籍<C++ GUI ...

  5. Qt开发经验小技巧51-60

    在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码. QString content = "测试中文"; Q ...

  6. Qt开发经验小技巧31-40

    代码判断MSVC编译器版本. if (_MSC_VER == 1800) MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) MSVC++ 12.0 _ ...

  7. Qt开发经验小技巧21-30

    如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可. 善于利用QComboBox的addItem ...

  8. Qt开发经验小技巧11-20

    获取类的属性 const QMetaObject *metaobject = object->metaObject(); int count = metaobject->propertyC ...

  9. Qt开发经验小技巧1-10

    当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时候用QTime ...

  10. Qt开发经验小技巧合集

    一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...

随机推荐

  1. 13 Multi-Head Self-Attention(从空间角度解释为什么做多头)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  2. Notification Manager 2.0.0 发布:新增飞书通知、通知路由、通知静默

    Notification Manager 是 KubeSphere 可观测团队开源的一款 Kubernetes 平台上的多租户通知管理系统,其从 Kubernetes 接收告警.事件.审计,根据用户设 ...

  3. Oracle 数据泵 定时全库备份&&删除备份文件【注意点】

    一.概述 在给客户部署的数据泵备份&&删除过期备份脚本时,脚本删除部分未生效,导致存储空间占用非常大. 手动执行该删除命令时,执行成功: 最后发现需要增加 find.rm 等命令的PA ...

  4. 轻量级网络-VoVNet 论文解读

    摘要 1,介绍 2,高效网络设计的影响因素 2.1,内存访问代价 2.2,GPU计算效率 3,建议的方法 3.1,重新思考密集连接 3.2,One-Shot Aggregation 3.3,构建 Vo ...

  5. spring boot中使用quratz实现定时。 使用task直接调用的实现方法

    1.定义工作类 2.创建配置类,将工作对象绑定到工作明细,然后创建触发器 与工作明细进行绑定 二.使用task实现定时任务 1.启动类上开启定时功能 2.在需要定时的任务上增加Schedule注解,并 ...

  6. Python一些常见的技巧及语句!!

    题记:关于遇到的一些python代码或者不清楚用法的函数.类别等我会在这里记录下来,方便日后学习和交流.之后研究生三年我会持续更新学习,可能得记录几千个吧. 1. copy.copy()和copy.d ...

  7. 2款使用.NET开发的数据库系统

    前言 今天大姚给大家分享2款使用.NET开发且开源的数据库系统. Garnet Garnet是一款由微软研究院基于.NET开源的高性能.跨平台的分布式缓存存储数据库,该项目提供强大的性能(吞吐量和延迟 ...

  8. vue 下载文件并且重命名

    <el-button type="primary" @click="xz(scope.row)" size="small">下载 ...

  9. 七、Spring Boot集成Spring Security之前后分离认证最佳实现

    二.自定义用户名密码认证过滤器RestfulUsernamePasswordAuthenticationFilter 1.注册过滤器方式 使用httpSecurity.addFilter/addFil ...

  10. [离线计算-Spark|Hive] 数据近实时同步数仓方案设计

    背景 最近阅读了大量关于hudi相关文章, 下面结合对Hudi的调研, 设计一套技术方案用于支持 MySQL数据CDC同步至数仓中,避免繁琐的ETL流程,借助Hudi的upsert, delete 能 ...