Qt研发易忽略问题整理(二)

说明

Qt研发易忽略问题整理(一)

1. 对于控件位置可能会影响其value的值问题。

这类问题容易发生在依据工程中数据设置某个控件位置(例如依据QSlider宽度和数据值定位控件位置),哪怕你是有resizeEvent,当控件在没show出来的之前,其pos, geometry, 如果没有resize触发。最初的值是与ui拖拽设计有关(就是ui拖拽的pos geometry)的,这个时候尽量保证ui宽度是正确的宽高。 如果是自定义的ui(不通过xxxx.ui)生成,那你也需要初始化其值,并且要保证其值设置能够与show出来的宽度保持一致, 不然容易造成控件位置错误。

2. 对于数据处理尽量基于原数据进行某种处理, 而不是对基于原数据二次或者多次处理后数据处理, 这样才不会产生数据进行多次处理导致与现实预期处理结果有太多差异

比如说, 图片裁剪处理,假如我直接通过文件路径读取图片后做某种处理后在控件显示某个尺寸大小qpixmap 然后保存,然后opengl渲染时可以获取此图片是经过截取scale处理后的, 此时相比原图片会有明显的失真处理压缩不是原图片清晰度了。 这个时候opengl层如果只需要原素材文件路径, 读取图片等分辨率大小,在依据提供的缩放比例后截取的QRect, 就可以直接获取基于原分辨率的图片的尺寸位置截取, 并且截取后的图片不用失真。

3. enabled disabled 对于parent widget 以及 child widget

此属性保存小部件是否启用通常,启用的小部件处理键盘和鼠标事件; 禁用的小部件不会。 QAbstractButton 例外。
某些小部件在禁用时会以不同方式显示。 例如,一个按钮可能会将其标签绘制为灰色。 如果您的小部件需要知道它何时启用或禁用,您可以使用类型为 QEvent::EnabledChange 的 changeEvent()。
禁用小部件会隐式禁用其所有子级。 启用分别启用所有子小部件,除非它们已被明确禁用。 在其父小部件保持禁用状态时,无法显式启用不是窗口的子小部件。
默认情况下,此属性为 true。

4. text-align 属性设置

一般来说 可以设置setTextAlignment属性, 本来想偷点懒, 通过qss 设置 text-align, 结果发现目前只有QPushButton QProgressBar支持

text-align  Alignment
The alignment of text and icon within the contents of the widget.
If this value is not specified, it defaults to the value that depends on the native style.
Example:

  QPushButton {
      text-align: left;
  }

This property is currently supported only by QPushButton and QProgressBar.

5. property-xxx 属性设置

这依赖于QObject 属性机制 property
qss

QLabel {
  font-size: 14px;
  border-radius: 3px;
  background-color: white;
  qproperty-alignment: AlignHCenter|AlignVCenter
  qproperty-text:'This is a Text Mesage';
}

6、QTableWidget表格内容自适应列宽

QHeaderView::Interactive
用户可以调整部分的大小。 也可以使用resizeSection()以编程方式调整该部分的大小。 段大小默认为defaultSectionSize。 (另请参见cascadingSectionResizes。)
 
QHeaderView::Fixed
用户无法调整该部分的大小。 只能使用resizeSection()以编程方式调整该部分的大小。 段大小默认为defaultSectionSize。
 
QHeaderView::Stretch
QHeaderView将自动调整该部分的大小以填充可用空间。 大小不能由用户或以编程方式更改。屏幕不够大时,会自动缩小,不出现滚动条。
 
QHeaderView::ResizeToContents
QHeaderView将自动调整该部分的大小以填充可用空间。 大小不能由用户或以编程方式更改。会出现滚动条,显示完整。
也可以混合使用。

this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);   
this->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); 

7. QSettings

要注意settings.value(“xxx/xxx”),注意节 键值使用。

8. QWidget如果visible为false, 及不可见, 其width height 不为0

9. 按照设计给予的icon大小发现背景图片background-image有重复, 设置样式时使用background-repeat

QPushButton#recordBtn:checked{
    border: none;
    margin:0px;
    color: white;
    background-image: url(:/images/images/bottom/bth_local store Pause_Default.svg);
	background-repeat:none;
}

10. 注意通过connect 连接lambda表达式函数,建议需要直接写连接方式, 不然lambda函数执行所在线程就在信号所发射的线程。

 connect(&m_worker2, &Worker::testSig, this, [this](int value){
        qDebug() << "__FUNCTION__ Worker::testSi" << QThread::currentThreadId() << "sig: " << value;
    }, Qt::QueuedConnection);
    m_worker2.startSigTest();

如下图:在这里插入图片描述

11. QLineEdit 之textChanged, editfinished ,textEdited 区别

QLineEdit::textChanged(const QString &text)

This signal is emitted whenever the text changes. The text argument is the new text.
Unlike textEdited(), this signal is also emitted when the text is changed programmatically, for example, by calling setText().
Note: Notifier signal for property text. 

只要是text 文本内容有修改,就会触发。 如果程序性改动比如设置setText, 也会触发

QLineEdit::textEdited(const QString &text)

This signal is emitted whenever the text is edited. The text argument is the new text.
Unlike textChanged(), this signal is not emitted when the text is changed programmatically, for example, by calling setText().

只要文本被编辑, 就会触发。如果程序性改动比如设置setText, 不会触发。

QLineEdit::editingFinished()

This signal is emitted when the Return or Enter key is pressed or the line edit loses focus. Note that if there is a validator() or inputMask() set on the line edit and enter/return is pressed, the editingFinished() signal will only be emitted if the input follows the inputMask() and the validator() returns QValidator::Acceptable.

在基于设置validator() or inputMask() ,当编辑结束后(按下return, enter键, 或者失去焦点), 如果此时满足设置条件QValidator::Acceptable. 此时会触发

12 “\\” 与 “\” 在表示windows api 路径时注意\

f (RegOpenKeyEx(HKEY_CURRENT_USER,
                 L"Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache",
                 0, KEY_READ, &hKey) != ERROR_SUCCESS)
{
    qDebug() << "windows api read reg failed!";
}
QSettings reg("HKEY_CURRENT_USER\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache",QSettings::NativeFormat);
等关于windows下的路径是, 如果使用\路径, 要注意用\\

13 “#”符和“##”符的作用含义

单独一个“#”符号表示:替换这个变量后,再加双引号引起来。

#define    __string_1(x)    #x__string_1(test)”等价于“"test"

“##”连接符号,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。
简单来说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。分隔的作用类似于空格。

#define example(name, type)    name_##type##_typeexample(name, linux)”等价于“"name_linux_type"”。

枚举定义导致使用数据判断出错

enum ManualType{
    Invalid,
    ST = 0,
    RT,
    RST,
};

这种情况下, Invalid 答应输出整形结果标记是0, 与ST数据结果一样了.。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值