Qt - Как определить, какой текст программа чтения с экрана должна читать, когда мышь наводит курсор на ячейку QTableWidget - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно сделать приложение Qt совместимым с программами чтения с экрана, такими как Jaws или NVDA (в настоящее время я использую NVDA для своих тестов).Для общих компонентов, таких как метки или кнопки, все работает нормально, и даже мои чистые графические компоненты, такие как кнопки изображений, работают, как и ожидалось, до тех пор, пока я использую свойство availableName.

Но мой интерфейс также содержит сетку QTableWidget,в котором я добавляю или удаляю пользовательские ячейки виджета динамически во время выполнения.Каждый из этих виджетов содержит изображение и текст, который я хочу прочитать с помощью программы чтения с экрана.

Application interface

Однако программа чтения с экрана ничего не говорит, покаЯ парю клетки.И когда я нажимаю на них, вместо текста, содержащегося в ячейке, произносится номер столбца и строки.

Я попытался поэкспериментировать со свойствами специальных возможностей, например, с помощью параметра visibleName метки виджета илиСам виджет, но никто не работал.Номера строк и столбцов по-прежнему читаются вместо текста, который я хочу, независимо от содержимого, заданного в свойстве availableName.

Так что же мне следует применять для чтения текста, содержащегося в моих ячейках?

Вот код, который я использую для добавления новой ячейки в сетку:

void MainForm::OnAddClicked()
{
    const int row    = (m_CellCount / 7);
    const int column = (m_CellCount % 7);

    // add a new line if required
    m_UI.twGridView->setRowCount(row + 1);

    QString                 text;
    QFont                   font("Segoe UI", 14);
    QFontMetrics            metrics(font);
    std::unique_ptr<QLabel> pImage(new QLabel());

    switch (m_CellCount % 3)
    {
        case 0:
        {
            text = metrics.elidedText("This is a very very long device name", Qt::ElideRight, m_UI.twGridView->columnWidth(column) - 10);
            pImage->setStyleSheet("image: url(resources/images/Device.png) center center;");
            break;
        }

        case 1:
            text = metrics.elidedText("iPod Shuffle Robbie", Qt::ElideRight, m_UI.twGridView->columnWidth(column) - 10);
            pImage->setStyleSheet("image: url(resources/images/Shuffle.png) center center;");
            break;

        case 2:
            text = metrics.elidedText("iPad Robbie", Qt::ElideRight, m_UI.twGridView->columnWidth(column) - 10);
            pImage->setStyleSheet("image: url(resources/images/iPad.png) center center;");
            break;
    }

    std::unique_ptr<QLabel> pLabel(new QLabel(text));
    pLabel->setFixedHeight(20);
    pLabel->setAlignment(Qt::AlignLeft | Qt::AlignBottom);
    pLabel->setFont(font);
    pLabel->setStyleSheet("color: rgb(243, 243, 243);");
    pLabel->setAccessibleName("The widget's label content is read"); // doesn't work

    std::unique_ptr<QWidget>     pWidget(new QWidget());
    std::unique_ptr<QVBoxLayout> pLayout(new QVBoxLayout(pWidget.get()));
    pLayout->addSpacing(10);
    pLayout->addWidget(pImage.get());
    pLayout->addSpacing(10);
    pLayout->addWidget(pLabel.get());
    pWidget->setLayout(pLayout.get());
    pWidget->setStyleSheet("background: none;");
    pImage.release();
    pLabel.release();
    pLayout.release();

    pWidget->setAccessibleName("The widget content is read"); // doesn't work
    m_UI.twGridView->setCellWidget(row, column, pWidget.get());
    pWidget.release();

    ++m_CellCount;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...