我有一个类是QObject的子类,我想将其注册为元类型.该QObject的文档 指出拷贝构造函数应该是私有的,但QMetaType文件指出,一个类型应该有一个公共的默认构造函数,一个公共的拷贝构造函数和析构函数公开.
我可以覆盖QObject的私有拷贝构造函数并声明一个公共拷贝构造函数,但这是安全/ ok /对吗?
class MyClass : public QObject {
Q_OBJECT
public:
MyClass();
MyClass(const MyClass &other);
~MyClass();
}
Q_DECLARE_METATYPE(MyClass);
Run Code Online (Sandbox Code Playgroud) 当我们看到一个简单的表格视图(甚至是我认为的列表视图)时,您首选的输入新数据的方法是什么.
使用这样的添加/删除按钮:

或者用一个空行表示这样的新记录:

我有一个名为Money的自定义类,我已使用Q_DECLARE_METATYPE()声明.
class Money {
public:
Money(double d) {
_value = d;
}
~Money() {}
QString toString() const {
return QString(_value);
}
private:
double _value;
};
Q_DECLARE_METATYPE(Money);
Money m(23.32);
Run Code Online (Sandbox Code Playgroud)
我将它存储在QVariant中,我想将其转换为QString:
QVariant v = QVariant::fromValue(m);
QString s = v.toString();
Run Code Online (Sandbox Code Playgroud)
变量s最终成为空字符串,因为QVariant不知道如何将我的自定义类型转换为字符串.有没有办法做到这一点?
我想在Linux下的简单C或C++程序中通过FTDI(串行)接口读取从Arduino发送的消息.Arduino发送一个两个字符的"标题",一个命令字节,后跟几个字节的数据,具体取决于命令.
我的第一次尝试是使用open()和read()简单地轮询数据,但这样做会导致大约12%的CPU使用率.这似乎不是适当的做事方式.
其次我读了libevent on实现了一个事件循环,当文件描述符上存在数据时触发事件.我的cpu使用率几乎没有,但在调用另一个事件之前我无法读取整个消息.收到整个消息时,事件不会触发,但只要文件描述符上有任何/某些数据可用就会触发.更多地看着它显然不会像我想要的那样工作.这是我的事件代码:http://pastebin.com/b9W0jHjb
第三,我用libevent实现了一个缓冲事件.它似乎工作得更好但仍然分开了一些消息.我的活动代码是:http://pastebin.com/PQNriUCN
第四,我抛弃了libevent并尝试了Boost的ASIO课程.我关注的例子是http://www.webalice.it/fede.tft/serial_port/serial_port.html.它似乎工作正常,但"事件循环"是"while(1){}",导致CPU使用率再次上升.循环只检查错误状态,而串行读取发生在另一个线程的回调中.我在while循环中添加了一个usleep(1),它将我的CPU使用率提高到了2%即可,但对于这样的轻量级程序来说仍然很重要.
libevent甚至底层epoll的大多数例子都使用TCP套接字,它似乎与串行端口数据的行为完全不同.
所以我的主要问题是:什么是一个很好的轻量级方法从串口读取消息而不需要大量轮询?(在linux中,使用C或C++)
首先,我使用的是Qt 4库和C++.
当某个属性(动态或其他)发生变化时,有没有办法得到通知(信号,事件,?)QObject?
我不能修改QObject类,因为它是Qt4库的一部分.有关QObject 此处的更多信息.