2016-12-27 9 views
1

Я пытаюсь получить данные буфера обмена через QClipboard. Вот мой код:сбой при попытке доступа к буферу

void MainWindow::getText() 
{ 
    QClipboard *clipboard = QGuiApplication::clipboard(); 
    const QMimeData *mime = clipboard->mimeData (QClipboard::Selection); 
    QString originalText = clipboard->text(); // no crashes in windows 
    //QString originalText = mime->text(); //this line causing program crash 
    ................. 
} 

getText() называется каждый 5 второй помощью QTimer. Вышеприведенный код отлично работает в Linux, когда я пытаюсь запустить код в Windows 7, он разбился.

ответ

0

Windows, не поддерживает QClipboard::Selection, поэтому сбой приложения каждый раз. Вот как я его решил

QString originalText; 
if(QSysInfo::productType() == "windows") { 
      QString clipboard = QApplication::clipboard()->text(); 
      originalText = clipboard; 
    } else { 
     // for linux 
     QClipboard *clipboard = QGuiApplication::clipboard(); 
     const QMimeData *mime = clipboard->mimeData (QClipboard::Selection); 
     originalText = mime->text(); 
    } 
+2

Обратите внимание, что macOS также не поддерживает эту функцию, поэтому в этом случае ваш код не будет работать. Лучше использовать ['QClipboard :: supportSelection()'] (http://doc.qt.io/qt-5/qclipboard.html#supportsSelection) для этой проверки, я думаю. – kefir500

2

clipboard->mimeData может быть пустым, так что вы можете либо кэшировать предыдущее состояние, или сделать следующее:

QString originalText = mime ? mime->text() : QString();