分类 Code 下的文章

今天参考 qt4 的书籍,在 qt5 的平台上面,用了 QSignalMapper,结果收到警告“ QSignalMapper is deprecated"。

经过一番查找,找到了相应的说明, 参考自:https://doc.qt.io/qt-5/qsignalmapper.html This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code. 官方建议 qt5 里面使用 lambda 方式表达。

下面是旧的方式:

class ButtonWidget : public QWidget
{
    Q_OBJECT

public:
    ButtonWidget(const QStringList &texts, QWidget *parent = 0);

signals:
    void clicked(const QString &text);

private:
    QSignalMapper *signalMapper;
};
ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
    : QWidget(parent)
{
    signalMapper = new QSignalMapper(this);

    QGridLayout *gridLayout = new QGridLayout;
    for (int i = 0; i < texts.size(); ++i) {
        QPushButton *button = new QPushButton(texts[i]);
        connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
        signalMapper->setMapping(button, texts[i]);
        gridLayout->addWidget(button, i / 3, i % 3);
    }

    connect(signalMapper, SIGNAL(mapped(QString)),
            this, SIGNAL(clicked(QString)));

    setLayout(gridLayout);
}

This class was mostly useful before lambda functions could be used as slots. The example above can be rewritten simpler without QSignalMapper by connecting to a lambda function. 下面是新的方式:

ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *gridLayout = new QGridLayout;
    for (int i = 0; i < texts.size(); ++i) {
        QString text = texts[i];
        QPushButton *button = new QPushButton(text);
        connect(button, &QPushButton::clicked, [=] { clicked(text); });
        gridLayout->addWidget(button, i / 3, i % 3);
    }
    setLayout(gridLayout);
}

今天用 qt 中的按键的时候,希望按键有两种状态,通过 clicked(bool) 发送信号给槽,结果一直发的是 false,不能为 true,后来终于找到问题了,有两种解决方法。

  1. 在 button 的属性里面选择 checkable
  2. 在代码里面增加 yourButton->setCheckable(true)

使用 qextserialport 编写串口助手的时候,提示找不到 __imp_SetupDiGetDeviceRegistryPropertyW,经过摸索有以下两种解决方法:

第一种: 把相应的源文件手动加入到项目中,不要加入 qextserialport.pri 文件,在 项目 pro 文件中,按照当前的系统平台,加入库文件,比如说: win 平台,需要加入

win32:LIBS             += -lsetupapi -ladvapi32 -luser32

第二种: 不要手动加入源文件到项目中。在 项目 pro 文件中加入 qextserialport.pri 文件。

include(3rdparty/qextserialport/src/qextserialport.pri)

相比较而言,明显是第二种更加方便。

转自: https://www.cnblogs.com/moon1992/p/5260226.html

阅读目录

一. 什么是JNI 二. 编写带有native声明的方法的java类 三. 使用javac命令编译所有的java类 四. 使用javah命令生成.h文件 五. 使用C/C++实现本地方法 六. 将C/C++编写的文件生成动态链接库   在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函数。

- 阅读剩余部分 -

转自:https://www.cnblogs.com/wzd5230/p/6744448.html

浮点型变量在计算机内存中占用4字节(Byte),即32-bit。

  遵循IEEE-754格式标准。 一个浮点数由2部分组成:底数m 和 指数e。

±mantissa × 2exponent (注意,公式中的mantissa 和 exponent使用二进制表示)

底数部分 使用2进制数来表示此浮点数的实际值。

指数部分 占用8-bit的二进制数,可表示数值范围为0-255。

         但是指数应可 正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可从 -126到128. 底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储,在存储中只有23-bit。

  到目前为止, 底数部分 23位 加上指数部分 8位 使用了31位。那么前面说过,float是占用4个字节即32-bit,那么还有一位是干嘛用的呢? 还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数。

  浮点数据就是按下表的格式存储在4个字节中:

Address+0 Address+1 Address+2 Address+3 Contents

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮点数正负,1为负数,0为正数

  E: 指数加上127后的值的二进制数

  M: 24-bit的底数(只存储23-bit)

      主意:这里有个特例,浮点数 为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。 通过上面的格式,我们下面举例看下-12.5在计算机中存储的具体数据:

Address+0 Address+1 Address+2 Address+3 Contents

0xC1 0x48 0x00 0x00 接下来我们验证下上面的数据表示的到底是不是-12.5,从而也看下它的转换过程。 由于浮点数不是以直接格式存储,他有几部分组成,所以要转换浮点数,首先要把各部分的值分离出来。

Address+0 Address+1 Address+2 Address+3

格式SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

二进制 11000001 01001000 00000000 00000000

16进制 C1 48 00 00

可见:

S: 为1,是个负数。

E:为 10000010 转为10进制为130,130-127=3,即实际指数部分为3.

M:为 10010000000000000000000。

 这里,在底数左边省略存储了一个1,

使用 实际底数表示为1.10010000000000000000000 到此,我们吧三个部分的值都拎出来了,现在,我们通过指数部分E的值来调整底数部分M的值。调整方法为:如果指数E为负数,底数的小数点向左移,如果指数E为正数,底数的小数点向右移。小数点移动的位数由指数E的绝对值决定。 这里,E为正3,使用向右移3为即得: 1100.10000000000000000000 至次,这个结果就是12.5的二进制浮点数,将他换算成10进制数就看到12.5了,如何转换,看下面: 小数点左边的1100 表示为 (1 × 2^3) + (1 × 2^2) + (0 × 2^1) + (0 × 2^0), 其结果为 12 。 小数点右边的 .100… 表示为 (1 × 2^-1) + (0 × 2^-2) + (0 × 2^-3) + ... ,其结果为0.5 。 以上二值的和为12.5, 由于S 为1,使用为负数,即-12.5 。所以,16进制 0XC1480000 是浮点数 -12.5 。

今天试了一下SWT控件 TEXT 中的回车事件,使用 defaultSelected 进行处理,结果怎么也不能触发事件。 经过仔细排查,发现是TEXT选中了 wrap 的原因,毕竟如果是多行的话,肯定是需要回车进行换行的,这样就和回车表示确定的功能相冲突了。所以wrap 覆盖了回车确定的功能。把 wrap 去掉,就可以正常触发了。

最近学习使用 eclipse rcp 来做一些插件。 首先下载安装 eclipse-rcp,然后安装 swt emerge -av swt

安装完成以后, 在 /usr/portage/distfiles/ 中找到 swt* 的压缩包,然后解压到 /usr/local/src 中去。

当然也可以在 eclipse 官网上面下载最新的 源码 ,网址类似这样 https://archive.eclipse.org/eclipse/downloads/drops4/R-4.9-201809060745/

打开 eclipse-rcp,新建项目后,项目属性中 java build path --> Libraries 中添加 /usr/local/src/swt 里面的 swt.jar 包。 然后在项目文件的 swt.jar 包上右键属性,java source attachment 中选择 源文件目录 /usr/local/src/swt 中的 swt.zip 包。

调试无问题后,打包后, 使用 java -jar 来运行 jar 包, 提示 Error: Could not find or load main class HelloSWT。 使用 jar xvf helloSWT.jar 来解压缩 jar 包, 在METE-INF/MANIFEST.MF 文件中添加 Class-Path:swt.jar

再次运行,提示 no main manifest attribute, in helloSWT.jar

发现这样不行,重新导出的时候,发现还有一个选项是 runable jar file export, 选择这个选项,然后选择导出路径,下面三个依赖包的选项意思是: (1)Extract required libraries into generated JAR。

把所有的import JAR都拆开来,包含在JAR的各个目录中,ex. net/org/xxx.class

(2)Package required libraries into generated JAR。

把所有的import JAR都包在JAR的根目录下

(3)Copy required libraries into a sub-folder next to the generated JAR。

把所有import JAR放在JAR外面独立的一个文件夹

正常我选择第二种, package打包,生成的 jar包,使用 java -jar,就可以正常运行了。