LINUX.ORG.RU

Android и Qt 5.2: Сегфолтится QApplication::clipboard() в Андроиде. Можно как-нибудь побороть?


0

1

Инструментарий:

- QtCreator 3.0.0
- Qt 5.2
- android-ndk r9c
- android-sdk r22.3
- Сборка под armeabi-v7a

Сделал минимальный проект, чтобы продемонстрировать проблему.

А именно, имеем код:

    qDebug() << "Before clipboard check";

    if(QApplication::clipboard()->mimeData()->hasFormat("text/plain"))
     qDebug() << "Clipboard include text data";

    qDebug() << "After clipboard check";

Ошибка в глубинах QApplication::clipboard()->mimeData()->hasFormat(«text/plain»). На этой строке происходит сегфолт при запуске в Андроидной виртуалке.

Вроде как метод статический, никаких проблем с памятью быть не должно. Тем не менее сегфолтится.

Может кто-нибудь сказать что здесь не так?

Файл (2,6 кб): http://rghost.ru/51439194

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Уточняю.

Разложил на :

    const QClipboard *clipboard = QApplication::clipboard();
    const QMimeData *mimeData = clipboard->mimeData();
    if(mimeData->hasFormat("text/plain"))
     qDebug() << "Clipboard include text data";

Затыкается на mimeData->hasFormat(«text/plain»).

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

https://qt.gitorious.org/qt/qtbase/source/ffac6ee2673a573a9db4f75a89c4c53251f...

QMimeData *QAndroidPlatformClipboard::mimeData(QClipboard::Mode mode)
{
    if (QClipboard::Clipboard != mode || !QtAndroidClipboard::hasClipboardText())
        return 0;

    QMimeData *mimeData = new QMimeData();
    mimeData->setText(QtAndroidClipboard::clipboardText());
    return mimeData;
}
Atragor
()
Последнее исправление: Atragor (всего исправлений: 1)
Ответ на: комментарий от andreyu

Да, нуль. Уже исправил код, теперь сегфолта нет.

Поведение отличается от десктопного. На десктопе, если в буфере обмена нет данных, объект mimeData() корректный, но пустой. Под Андроидом вместо него NULL.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Поведение отличается от десктопного. На десктопе, если в буфере обмена нет данных, объект mimeData() корректный, но пустой. Под Андроидом вместо него NULL.

А что сказано в документации?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

В документации написано:

Returns a reference to a QMimeData representation of the current clipboard data.

The mode argument is used to control which part of the system clipboard is used. If mode is QClipboard::Clipboard, the data is retrieved from the global clipboard. If mode is QClipboard::Selection, the data is retrieved from the global mouse selection. If mode is QClipboard::FindBuffer, the data is retrieved from the search string buffer.

The text(), image(), and pixmap() functions are simpler wrappers for retrieving text, image, and pixmap data.

Ничего про возможность возврата NULL не сказано.

Тут вот выше рекомендуют использовать QAndroidPlatformClipboard. Однако в официальной документации этот класс вообще не описан. Ни в локальном ассистенте, ни на сайте:

http://qt-project.org/search?search=QAndroidPlatformClipboard

Или это кусок исходника Qt товарищ показывает.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Или это кусок исходника Qt товарищ показывает.

Так и есть, просто хотел показать, что действительно 0 может быть.

Вообще, вполне логично ожидать nullptr от метода, возвращающего указатель.

Atragor
()
Ответ на: комментарий от Xintrea

Ничего про возможность возврата NULL не сказано.

Ну ведь clipboard->mimeData() возвращает указатель, что удивительного в том, что указатель может оказатья нулевым?

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.