Qt 4.8 为什么我的 QIODevice 在此代码中没有输出文本?
Qt 4.8 Why my QIODevice not output a text in this code?
如果使用 QTextStream 控制台 (stdout) - 一切正常,但如果我编写自定义 IODevice,在 qInstallMsgHandler() 之后控制台中没有文本
main.cpp
#include "remoteconsole.h"
#include <QCoreApplication>
#include <QDateTime>
#include <QTimer>
QTextStream *out;
void logOutput(QtMsgType type, const char *msg)
{
QString debugdate = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
*out << debugdate << " " << type << msg << endl;
}
int main(int argc, char *argv[])
{
int i;
QCoreApplication a(argc, argv);
RemoteConsole * remote = new RemoteConsole(&a);
QTextStream console((QIODevice *)remote);
out = &console;
qDebug() << "start qInstallMsgHandler";
qInstallMsgHandler(logOutput);
qDebug() << "end qInstallMsgHandler"<<endl;
for(i=0;i<10;i++){
qDebug() << i<<endl;
}
QTimer *timer = new QTimer();
a.connect(timer, SIGNAL(timeout()), &a, SLOT(quit()));
timer->start(5000);
a.exec();
return 0;
}
我在文件 remoteconsole.h.cpp
中的 IODevice 实现
#ifndef REMOTECONSOLE_H
#define REMOTECONSOLE_H
#include <QIODevice>
#include <QDebug>
class RemoteConsole: public QIODevice
{
Q_OBJECT
public:
RemoteConsole(QObject *parent);
~RemoteConsole();
private:
Q_DISABLE_COPY(RemoteConsole)
protected:
qint64 readData(char* data, qint64 maxSize);
qint64 writeData(const char* data, qint64 maxSize);
};
#endif // REMOTECONSOLE_H
#include "remoteconsole.h"
RemoteConsole::RemoteConsole(QObject* parent=0) :
QIODevice(parent)
{
}
RemoteConsole::~RemoteConsole(){}
qint64 RemoteConsole::readData(char *data, qint64 maxlen){
qDebug() << data <<endl;
return maxlen;
}
qint64 RemoteConsole::writeData(const char *data, qint64 len){
printf("writeData");
qDebug() << data <<endl;
return len;
}
将来我想用 QTCPServer 扩展这段代码,它将调试输出发送到通过 telnet 或 nc 连接到设备的客户端。
您在 qInstallMsgHandler
调用后没有在控制台中获得任何文本,因为您将所有调试数据发送到您的 RemoteConsole
对象。
此外,您的代码中还有一些其他问题。
- 您应该先调用
QIODevice::open
,然后才能对该设备进行操作。
- 在
RemoteConsole::writeData
函数中,您将有一个无限循环,因为您在那里使用了 qDebug()
。 qDebug()
将调用 logOutput
,后者将再次调用 RemoteConsole::writeData
。
如果使用 QTextStream 控制台 (stdout) - 一切正常,但如果我编写自定义 IODevice,在 qInstallMsgHandler() 之后控制台中没有文本
main.cpp #include "remoteconsole.h"
#include <QCoreApplication>
#include <QDateTime>
#include <QTimer>
QTextStream *out;
void logOutput(QtMsgType type, const char *msg)
{
QString debugdate = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
*out << debugdate << " " << type << msg << endl;
}
int main(int argc, char *argv[])
{
int i;
QCoreApplication a(argc, argv);
RemoteConsole * remote = new RemoteConsole(&a);
QTextStream console((QIODevice *)remote);
out = &console;
qDebug() << "start qInstallMsgHandler";
qInstallMsgHandler(logOutput);
qDebug() << "end qInstallMsgHandler"<<endl;
for(i=0;i<10;i++){
qDebug() << i<<endl;
}
QTimer *timer = new QTimer();
a.connect(timer, SIGNAL(timeout()), &a, SLOT(quit()));
timer->start(5000);
a.exec();
return 0;
}
我在文件 remoteconsole.h.cpp
中的 IODevice 实现#ifndef REMOTECONSOLE_H
#define REMOTECONSOLE_H
#include <QIODevice>
#include <QDebug>
class RemoteConsole: public QIODevice
{
Q_OBJECT
public:
RemoteConsole(QObject *parent);
~RemoteConsole();
private:
Q_DISABLE_COPY(RemoteConsole)
protected:
qint64 readData(char* data, qint64 maxSize);
qint64 writeData(const char* data, qint64 maxSize);
};
#endif // REMOTECONSOLE_H
#include "remoteconsole.h"
RemoteConsole::RemoteConsole(QObject* parent=0) :
QIODevice(parent)
{
}
RemoteConsole::~RemoteConsole(){}
qint64 RemoteConsole::readData(char *data, qint64 maxlen){
qDebug() << data <<endl;
return maxlen;
}
qint64 RemoteConsole::writeData(const char *data, qint64 len){
printf("writeData");
qDebug() << data <<endl;
return len;
}
将来我想用 QTCPServer 扩展这段代码,它将调试输出发送到通过 telnet 或 nc 连接到设备的客户端。
您在 qInstallMsgHandler
调用后没有在控制台中获得任何文本,因为您将所有调试数据发送到您的 RemoteConsole
对象。
此外,您的代码中还有一些其他问题。
- 您应该先调用
QIODevice::open
,然后才能对该设备进行操作。 - 在
RemoteConsole::writeData
函数中,您将有一个无限循环,因为您在那里使用了qDebug()
。qDebug()
将调用logOutput
,后者将再次调用RemoteConsole::writeData
。