标签: qiodevice

自定义URL协议处理程序Qt 5

我想在我的应用程序中使用Video/ MediaPlayerQML元素,并让它从自定义流中播放视频.QMediaPlayer似乎支持这个,因为你可以告诉它从QIODevice哪个可以做任何你想做的事情.但MediaPlayer只支持URL.

有什么办法可以注册我自己使用自己的流媒体协议的URL方案吗?例如,说我想做rtsp2://...,我可以做一些模糊的事情:

class Rtsp2 : public QIODevice
{
    // open, read, seek, close, etc.
}

QCoreApplication::registerUrlProtocol("rtsp2", Rtsp2);
Run Code Online (Sandbox Code Playgroud)

url qt qml qt-quick qiodevice

9
推荐指数
1
解决办法
1775
查看次数

问:如何通过系统调用捕获错误?

我正在构建一个GUI应用程序,我在其中进行系统调用并调用gnuplot来运行脚本.现在我想构建一个错误消息,说明什么时候出错(例如没有安装gnuplot或者路径错误).

所以我一直在考虑推出一个QMessageBox,但我不知道如何检查系统调用是否成功.

if(//System call didn't work)
{
    QMessageBox msgBox;
    msgBox.setWindowTitle("Error");
    msgBox.setIcon(QMessageBox::Critical);
    msgBox.setText("GNUPLOT was not installed");
    msgBox.exec();
}
Run Code Online (Sandbox Code Playgroud)

我的系统调用如下所示:

system(gnuplot script.txt);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

c++ qt qprocess qiodevice qtcore

6
推荐指数
1
解决办法
1098
查看次数

输入从C++到QML视频播放器的视频数据

我正在寻找一种在QML中实现视频播放器应用程序的最佳方法.几乎所有QML示例都是从文件系统或Web读取文件:

MediaPlayer {
    id: mediaplayer
    source: "groovy_video.mp4"
}

VideoOutput {
    anchors: parent.fill
    source: mediaplayer
}
Run Code Online (Sandbox Code Playgroud)

我想指定我自己的源MediaPlayer- 一个C++ QObject派生类,它有一个类似的接口QIODevice.这对我的需求来说是完美的.我需要预先加载部分视频,并将其缓存以供以后使用.

有一个简单的解决方案满足我的需求吗?(我使用的是Qt 5.2)

qt qml qiodevice qmediaplayer

5
推荐指数
1
解决办法
1384
查看次数

如果打开设备,QSerialPort 会导致程序停止(无限循环?)

我想在串行设备上写入。不幸的是,我感觉 QSerialPort 在 linux 下没有正确实现。与其他方法 (python) 相比,我得到 !sometimes! 当我尝试调用时程序挂起:

serial.open(QIODevice::ReadWrite)
Run Code Online (Sandbox Code Playgroud)

我正在使用http://qt-project.org/wiki/QtSerialPort 中的示例(见下文)。QSerialPortInfo 工作正常,因此我可以在打开它之前搜索我的设备。该问题出现在所有 Qt 5.* 系列中。我目前正在使用 OpenSuse 存储库中的 5.3 测试版。其他工具或方法证明设备正在工作(Windows 或 Python)。

// Example use QSerialPortInfo
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
    qDebug() << "Name        : " << info.portName();
    qDebug() << "Description : " << info.description();
    qDebug() << "Manufacturer: " << info.manufacturer();

    // Example use QSerialPort
    QSerialPort serial;
    serial.setPort(info);
    if (serial.open(QIODevice::ReadWrite)) // Hang of the program
        serial.close();
}
Run Code Online (Sandbox Code Playgroud)

工作python脚本:

com_port = 4
baud_rate = '9600'
pySerial = serial.Serial(com_port, …
Run Code Online (Sandbox Code Playgroud)

c++ qt qiodevice qtserialport qtcore

4
推荐指数
1
解决办法
1845
查看次数

readyRead()在Qt中如何工作?

这是我在这个网站上的第一个问题!

我在从COM端口读取数据时遇到一些麻烦,我从另一个COM端口发送完整的消息,当我用Qt接收它时,它总是被切成多个子消息.

void SerialPortReader::init()
{
    connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}   

void SerialPortReader::readData()
{
//    m_serialPort->waitForReadyRead(200);
    QByteArray byteArray = m_serialPort->readAll();
    qDebug() << byteArray;

    if(byteArray.startsWith(SOF) && byteArray.endsWith(EOF_LS)
        && byteArray.size() >= MIN_SIZE_DATA) {
    decodeData(byteArray.constData());
    } else {
        qDebug() << "LIB SWCom : Unvalid trame !";
    }
}
Run Code Online (Sandbox Code Playgroud)

发送的消息长度为25或27字节,如果我使用Putty或Hyperterminal来读取它们,我没有遇到麻烦.此外,如果我使用2个模拟串口COM进行通信,我没有这个问题...它只发生在Qt读取系统和2个物理COM端口...

我认为在准确发出readyRead信号时我没有得到...

我很困惑,提前谢谢你的帮助!

c++ qt qiodevice qtserialport qtcore

3
推荐指数
1
解决办法
2万
查看次数

Qt中是否存在进程内本地管道?

Qt是否有一QIODevice对可用于进程点对点通信的对?

人们可以使用的混凝土QTCPSocketQLocalSocket,但服务器端连接API是有点麻烦,而且似乎浪费通过OS强制的数据.

c++ qt qiodevice

3
推荐指数
1
解决办法
1049
查看次数

使用qt将自定义类写入文件的最佳方法

嘿所有(在那里:).
在Qt中将自定义类写入文件最好的方法是什么?
先感谢您.
马蒂亚斯

serialization qt qfile qiodevice

2
推荐指数
1
解决办法
4835
查看次数

QMediaplayer从Mac OS上加密的自定义QIODevice流式传输(10.9)

我目前正在将应用程序从Qt4(.8.4)移植到Qt5(.2.0).我几乎完成了所有已知的更改,例如弃用toAscii() - 函数,缺少QtGui等等.现在我们有一个使用声子框架的音乐播放器,它不再受支持,并被QtMultimedia模块取代,包括QMediaPlayer和一堆音频处理类.

我们的播放器实现采用自定义QIODevice.此设备为磁盘上的加密audiofiles提供接口.现在播放器向设备询问x字节,设备从加密文件中读取,解密播放器要求的字节并返回它们.

现在我在多媒体模块中搜索了一个函数来重用我的IODevice并找到了以下函数:

void setMedia(const QMediaContent & media, QIODevice * stream = 0)
Run Code Online (Sandbox Code Playgroud)

并使用如下:

m_pDecryptingMediaDevice = new BYIODevice(filename);    
m_pDecryptingMediaDevice->open(QIODevice::ReadOnly);    
m_pPlayer->setMedia(0, m_pDecryptingMediaDevice);
Run Code Online (Sandbox Code Playgroud)

其中m_pDecryptingMediaDevice是QIODevice-subclass,m_pPlayer是QMediaPlayer.

现在在Windows上,一切都按预期工作.QMediaplayer将其MediaStatus更改为QMediaPlayer :: LoadingMedia并向我的设备询问字节数.然后更改为QMediaPlayer :: State PlayingState,状态设置为BufferedMedia.一切安好.在Mac OS上的不幸(10.9.1)我只得到QMediaPlayer :: PlayingState而已.播放器/ audiobackend从不向我的设备询问字节数,也不调用任何其他功能.我不认为这个错误与自定义QIODevice有关,而是与QMediaPlayer有关,因为播放器甚至不询问任何字节或调用设备上的任何功能.

我只是试图将其分解为一个小测试项目:

QMediaPlayer *player = new QMediaPlayer(this);
QFile *music = new QFile("C:/Users/.../Music/Test.mp3");
music->open(QIODevice::ReadOnly);
player->setMedia(0, music);
connect(ui->pushButton, SIGNAL(clicked()), player, SLOT(play()));
connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stateChanged(QMediaPlayer::State)));
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这根本不起作用 - 不是在Windows上,而是在Mac OS上.总是有效的是给玩家一个URL

根据使用函数setMedia(const QMediaContent&media,QIODevice*stream = 0)将QIODevice流式传输到QMediaPlayer,是否有任何类似案例的经验?我坚持这个.

最好的问候和许多提前感谢.

一月

c++ qt5 qiodevice qmediaplayer qtmultimedia

2
推荐指数
1
解决办法
2602
查看次数

"QIODevice设备未打开"仅在发布时构建

我正在使用QNetworkAccessManager来传输文件.在Debug中构建程序时,我的程序运行没有任何问题.但是在Release中构建问题有一个奇怪的问题:QIODevice :: read(QFile,"我的文件路径"):设备未打开

我的代码有什么问题?谢谢你的帮助!

QHttpMultiPart* getPacket(QString imgPath)
{
    QHttpMultiPart *pMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    QFile *imgFile = new QFile(imgPath);
    imgFile->setParent(pMultiPart);
    Q_ASSERT(imgFile->open(QIODevice::ReadWrite));

    QHttpPart imagePart;
    imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"img\"; filename=\"target.jpg\""));
    imagePart.setBodyDevice(imgFile);
    pMultiPart->append(imagePart);

    return pMultiPart;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    JTest testObj;
    QNetworkAccessManager manager;

    QHttpMultiPart *pHMP = getPacket("F:/Temp/1.jpg");
    QNetworkReply *pNR = manager.put(QNetworkRequest(QUrl("http://192.168.11.102:8080/Test")), pHMP);
    QObject::connect( pNR, SIGNAL(finished()), &testObj, SLOT(handleTransmissionFinished()) );

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

qt qtnetwork qiodevice

1
推荐指数
1
解决办法
266
查看次数