‘壹’ Qt网络编程 服务器异常断开,不能检查到网络状态变化
自己做心跳保活。因为异常断开不属于qt的处理范围,而tcp协议栈又不存在自动处理异常断线的功能,tcp连接在不正常关闭情况下通常都会被协议栈保持存活一段时间(具体和操作系统协议栈实现和设置有关)。qt无法获得tcp协议栈的状态消息,也就不会做出任何反应。所谓心跳机制请参照以下网址内容:
http://ke..com/view/4372209.htm
‘贰’ Qt中总是提示部件的objectName没有定义是怎么回事
Qt Designer为程序员提供了可视化的设计能力,可用于开发应用程序中的所有或者部分窗体。交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
把自定义控件集成到Qt Designer中
要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在。有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级”法和插件法。
升级法最为简便快捷。顾名思义,升级法就是把Qt自有的控件进行升级改造一番。找一个Qt自有的控件,如果它和我们新加的自定义控件有着相似的API,那么只要在Qt Designer的对话框里面完成一些新控件的信息就一切大吉,新控件就可以在Qt Designer中使用了。但是在编辑的时候和预览时,还是和原来的Qt控件没有什么两样。
现在把HexSpinBox控件用升级方法集成到Qt Designer中:
1、用Qt Designer创建一个新的窗体,把控件箱里的QSpinBox添加到窗体中。
2、右击旋转盒,选择“Promote to Custom Widget”上下文菜单。
3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”
好了。在uic生成的包含有QSpinBox的控件文件中,包含文件变为“hexspinbox.h”,并且初始化为一个HexSpinBox的实例,而不是QSpinBox。在Qt Designer中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。
Figure 5.6. Qt Designer's custom widget dialog
升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。
插件法需要创建一个动态库,使Qt Designer能够在实时加载,创建控件的实例。这样,Qt Designer就可以在编辑窗体或者预览的时候使用自定义控件。Qt Designer用Qt的meta-object系统动态获得自定义控件的全部属性。现在以IconEditor为例,用插件法把IconEditor集成到Qt Designer中。
首先,我们从继承一个类,重写一些虚函数。我们假定这个类的源代码在iconeditorplugin目录中,IconEditor类的代码在与它平行的目录iconeditor中。
‘叁’ Qt中bytesAvailable()怎么显示没有定义
pro中加入 qt+=net
‘肆’ qt中ui提示未定义,请问是怎么回事
ui是你项目中对应于当前这个类的界面。。使用Qt Creator建一个Ui Widget吧。。ui这东西是不了的。你必须自己建。逻辑代码都一样。但是缺UI。
‘伍’ Qt Socket网络编程 服务器端提示QIODevice::read (QTcpSocket): device not open,但是与客户端连接成功
这是因为文件路径不对造成的,解决方法如下:
1、首先pro文件配置:Qt网络功能需要在pro文件增加网络库。
‘陆’ linux中qt无法连接网络
安装好Qt开发工具后,打开Qt发现如果是空白页面,有以下几种情况:
1、可能是你没有安装好~就算是使用官方的命令进行安装的,也是有这种情况的~
2、跟网络没有关系,你只安装了Qt没有安装相应的插件~
解决办法:
在Qt官网下载最新版本的Qt,然后进行安装~~~
‘柒’ 解决QT的QWebsocket系统BUG,Mask为0导致网络连接断开的问题
项目使用qwebsocket。没想到发现一个大bug。
客户端建立5000连接同时发送心跳包给服务器,然后频繁会有连接断开。
服务器找到原因,QWebsocket的数据帧的mask值(大概是个十六进制的东西)错误,这个东西的最高位必须不能为0才可以,硬性规定,否则服务器会强制关闭这个连接。导致客户端收到“远程服务器连接断开”的error。
解决方法:
QT的QWebsocket有个接口,叫做setMaskGenerator,可以设置mask生成器,具体如下:
CMaskGenerator * m_mask = new CMaskGenerator();
QWebSocket* qwskt= new QWebSocket();
qwskt->setMaskGenerator(m_mask);
CMaskGenerator 类:
class CMaskGenerator : public QMaskGenerator
{
Q_DISABLE_COPY(CMaskGenerator)
public:
CMaskGenerator(QObject *parent = Q_NULLPTR) :QMaskGenerator(parent)
{
}
virtual quint32 nextMask()
{
quint32 val = quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max());
while (val == 0)
{
seed();
val = quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max());
}
return val;
}
virtual bool seed()
{
qsrand(QDateTime::currentDateTime().toTime_t());
return true;
}
private:
};
亲测此问题解决了,代码不必修改,直接可以用。
quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max());
是Qt原本的随机规则,它不为0就没有问题,但我不知此值的具体要求(上限等等),所以只能沿用Qt的这个随机规则,用循环保证它不为0
‘捌’ qt 中ui总是提示没有定义,是怎么回事
如果你没有用qtcreator的话,你是不是没有加图形界面编译后生成的头文件,比如类似于ui_widget.h
‘玖’ QT 网络编程问题
先做一个QTcpServer作为监听socket,监听后如果出发newConnection信号,说明有连接进来。
然后通过nextPendingConnection()可以得到一个QTcpSocket,这就是用来和客户端进行通信用的套接字。
监听socket仍然可以继续监听。QTcpSocket可以用来和客户端通信。
如果通信负荷比较大,可以把每个客户端socket放入单独的线程(或进程)进行处理。负荷不大,则不需要。
‘拾’ 在Linux下使用QT开发,为什么总提示成员函数没有定义呢
如果你曾经成功编译过用Qt写的程序,我就不推荐你用configure来重编Qt了
推荐你去http://www.qtcn.org