QT Невозможно нарисовать рамку на экране (QRect и QRubberBand) - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь написать инструмент на C ++, который поможет мне в изучении языка. Он захватит область на экране (слово или предложение), обработает текст, а затем отобразит информацию о захваченном тексте в приложении GUI.

Это основная c диаграмма того, что я пытаюсь сделать: enter image description here

Это должно быть очень похоже на инструменты захвата экрана, такие как gnome-screenshot и инструмент Microsoft snipping tool на Windows.

Стороннее приложение - это что-то вроде программы просмотра PDF-файлов или изображений, содержащих текст, пригодный для сканирования. Мое приложение отображает информацию о захваченном тексте. Мое приложение также отображает aws «окно захвата» с изменяемым размером на экране, показанное красным прямоугольником, окружающим слово на диаграмме.

У меня вопрос о рисовании этого красного квадрата на экране. Как нарисовать красный прямоугольник на экране? Я пытался сделать это как с xLib, так и с QT, хотя я бы предпочел сделать это с QT, поскольку он лучше документирован и кроссплатформенный.

edit: Я изменил вопрос, чтобы сделать его более кратким и ясно для моей цели, и как принятый ответ решает мою проблему.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Принятый ответ является предпочтительным решением этого вопроса, но после ответа на этот вопрос я нашел пример проекта, который выполнил то, что я собирался использовать с xlib.

https://github.com/gvalkov/xrectsel

Я включил это для полноты, но решение QT имеет лучший API и является кроссплатформенным. Итак, это лучше соответствует моим потребностям в этой программе.

1 голос
/ 26 мая 2020

Вам необходимо создать безрамочное окно alwaysOnTop, содержащее виджет. Окно должно быть определено как имеющее полупрозрачный фон, тогда как виджет будет использоваться для отображения границы (или полупрозрачного фона). Затем вы можете управлять положением и размером окна с помощью кода, обнаруживая щелчки мыши в вашем окне, которое открывает PDF-файл.

Вот пример:

demo image

Код:

QMainWindow window;
window.setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
window.setAttribute(Qt::WA_TranslucentBackground, true);
window.setFixedSize(80, 20);
window.move(500,500);

QWidget widget(&window);
widget.setStyleSheet("border: 3px solid rgb(255,0,0)");

window.setCentralWidget(&widget);
window.show();
...