美文网首页
Qt开发经验小技巧231-235

Qt开发经验小技巧231-235

作者: feiyangqingyun | 来源:发表于2022-08-05 15:37 被阅读0次
  1. 关于c++中继承多态virtual和override的几点总结。
  • 子类可以直接使用基类中的protected下的变量和函数。
  • 基类函数没加virtual,子类有相同函数,实现的是覆盖。用基类指针调用时,调用到的是基类的函数;用子类指针调用时,调用到的是子类的函数。
  • 基类函数加了virtual时,实现的时重写。用基类指针或子类指针调用时,调用到的都是子类的函数。
  • 函数加上override,强制要求子类相同函数需要是虚函数,而且必须重新实现,否则会编译报错。
  • 子类的virtual可加可不加,建议加override不加virtual。
  • 基类中的纯虚函数(virtual void play() = 0;)在基类中无需在cpp中实现,但是必须在子类实现,否则编译报错。
  • 继承多态最大的好处就是提炼共性,将通用的变量和方法信号等,全部放在基类,子类负责实现自己需要的特殊的部分即可。
  1. 关于 QTableView、QTableWidget 悬停整行选中效果,网上大多数都是针对 QTableWidget 的实现,针对 QTableView 的也都是通过委托或者重新painter实现。
  • 前提:设置选中单元格自动选中整行,tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  • 安装事件过滤器,识别到当前坐标处的数据模型,然后设置当前模型为鼠标悬停处的模型即可。这个取巧的办法可以节省大量的工作。
  • 无论 QTableView、QTableWidget 都用此方法都可以。
  1. Qt中如何避免和第三方的signals、slots等关键字冲突。
  • 第一步:在pro中加上 CONFIG += no_keywords 。
  • 第二步:项目中之前所有的 signals 改成 Q_SIGNALS,slots 改成 Q_SLOTS 等。
  • 第三步:彻底重新编译项目,这样就关键字不冲突了。
  1. pro中区分不同的操作系统及硬件平台。
win32 {}
unix {}
//Qt5可以直接用 linux{} Qt4切记需要用 unix:!maxc{}
unix:!maxc{}
linux {}
maxc {}
android {}
wasm {}

//表示64位平台
contains(QT_ARCH, x86_64) {}
//表示arm平台
contains(QT_ARCH, arm) || contains(QT_ARCH, arm64) {}
//万能办法直接切换到套件打印下 QT_ARCH 看下什么字符
message($$QT_ARCH)
  1. 在显示视频画面位置的时候,一般会有三种机制作为参考,自动调整(画面尺寸大于显示控件尺寸则等比例缩放,否则原图显示)、等比例缩放、拉伸填充。Qt中图片类QImage都提供了缩放策略的参数设置,比如Qt::KeepAspectRatio表示等比例缩放,但很多时候我们需要的是设置控件的大小,其实QSize类就提供了对应的方法scale专门解决这个问题,这个方法很容易被忽视。
//传入图片尺寸和窗体区域及边框大小返回居中区域
static QRect getCenterRect(const QSize &imageSize, const QRect &widgetRect, int borderWidth = 2, bool alwaysScale = true)
{
    QSize newSize = imageSize;
    QSize widgetSize = widgetRect.size() - QSize(borderWidth * 2, borderWidth * 2);

    //alwaysScale = false 表示只有尺寸超过窗体尺寸才缩放否则就原图尺寸
    if (alwaysScale) {
        newSize.scale(widgetSize, Qt::KeepAspectRatio);
    } else if (newSize.width() > widgetSize.width() || newSize.height() > widgetSize.height()) {
        newSize.scale(widgetSize, Qt::KeepAspectRatio);
    }

    int x = widgetRect.center().x() - newSize.width() / 2;
    int y = widgetRect.center().y() - newSize.height() / 2;
    return QRect(x, y, newSize.width(), newSize.height());
}

//传入图片尺寸和窗体尺寸及缩放策略返回合适尺寸的图片
static void getScaledImage(QImage &image, const QSize &widgetSize, bool alwaysScale = false, bool fast = true)
{
    //alwaysScale = false 表示只有尺寸超过窗体尺寸才缩放否则就原图尺寸
    if (alwaysScale) {
        image = image.scaled(widgetSize, Qt::KeepAspectRatio, fast ? Qt::FastTransformation : Qt::SmoothTransformation);
    } else if (image.width() > widgetSize.width() || image.height() > widgetSize.height()) {
        image = image.scaled(widgetSize, Qt::KeepAspectRatio, fast ? Qt::FastTransformation : Qt::SmoothTransformation);
    }
}

国内站点:https://gitee.com/feiyangqingyun
国际站点:https://github.com/feiyangqingyun

相关文章

  • Qt开发经验小技巧231-235

    关于c++中继承多态virtual和override的几点总结。 子类可以直接使用基类中的protected下的变...

  • Qt开发经验小技巧91-100

    数据库处理一般建议在主线程,如果非要在其他线程,务必记得打开数据库也要在那个线程,即在那个线程使用数据库就在那个线...

  • Qt开发经验小技巧111-120

    在不同的平台上文件路径的斜杠也是不一样的,比如linux系统一般都是 / 斜杠,而在windows上都是 \ 两个...

  • Qt开发经验小技巧101-110

    如果需要在尺寸改变的时候不重绘窗体,则设置属性即可 this->setAttribute(Qt::WA_Stati...

  • Qt开发经验小技巧121-130

    QLineEdit除了单纯的文本框以外,还可以做很多特殊的处理用途。 限制输入只能输入IP地址。 限制输入范围,强...

  • Qt开发经验小技巧146-150

    Qt中自带的很多控件,其实都是由一堆基础控件(QLabel、QPushButton等)组成的,比如日历面板 QCa...

  • Qt开发经验小技巧131-140

    Qt新版本往往会带来一些头文件的更新,比如以前使用QPainter绘制,不需要额外包含QPainterPath头文...

  • Qt开发经验小技巧141-145

    QImage支持xpm图标,查看Qt内置的QStyle风格的代码中可以发现大量的xpm图标定义,通过代码的形式来产...

  • Qt开发经验小技巧156-160

    Qt的UI界面在resize以后有个BUG,悬停样式没有取消掉,需要主动模拟鼠标动一下。 项目中启用c++11语法...

  • Qt开发经验小技巧151-155

    当Qt中编译资源文件太大时,效率很低,或者需要修改资源文件中的文件比如图片、样式表等,需要重新编译可执行文件,这样...

网友评论

      本文标题:Qt开发经验小技巧231-235

      本文链接:https://www.haomeiwen.com/subject/gpupwrtx.html