8#include <QtGui/qwindow.h>
10#if QT_CONFIG(accessibility)
12#include <QtGui/private/qaccessiblebridgeutils_p.h>
26QWasmAccessibility::QWasmAccessibility()
32QWasmAccessibility::~QWasmAccessibility()
37QWasmAccessibility *QWasmAccessibility::s_instance =
nullptr;
39QWasmAccessibility* QWasmAccessibility::get()
44void QWasmAccessibility::addAccessibilityEnableButton(
QWindow *
window)
46 get()->addAccessibilityEnableButtonImpl(
window);
49void QWasmAccessibility::removeAccessibilityEnableButton(
QWindow *
window)
51 get()->removeAccessibilityEnableButtonImpl(
window);
54void QWasmAccessibility::addAccessibilityEnableButtonImpl(
QWindow *
window)
56 if (m_accessibilityEnabled)
59 emscripten::val container = getContainer(
window);
60 emscripten::val
document = getDocument(container);
61 emscripten::val
button =
document.call<emscripten::val>(
"createElement", std::string(
"button"));
62 button.set(
"innerText", std::string(
"Enable Screen Reader"));
63 button[
"classList"].call<
void>(
"add", emscripten::val(
"hidden-visually-read-by-screen-reader"));
64 container.call<
void>(
"appendChild",
button);
66 auto enableContext = std::make_tuple(
button, std::make_unique<qstdweb::EventCallback>
67 (
button, std::string(
"click"), [
this](emscripten::val) { enableAccessibility(); }));
68 m_enableButtons.insert(std::make_pair(
window, std::move(enableContext)));
71void QWasmAccessibility::removeAccessibilityEnableButtonImpl(
QWindow *
window)
74 if (
it == m_enableButtons.
end())
78 auto [element, callback] =
it->second;
80 element[
"parentElement"].call<
void>(
"removeChild", element);
81 m_enableButtons.erase(
it);
84void QWasmAccessibility::enableAccessibility()
90 m_accessibilityEnabled =
true;
91 for (
const auto& [
key,
value] : m_enableButtons) {
92 const auto &[element, callback] =
value;
95 element[
"parentElement"].call<
void>(
"removeChild", element);
97 m_enableButtons.clear();
98 populateAccessibilityTree(QAccessible::queryAccessibleInterface(m_rootObject));
101emscripten::val QWasmAccessibility::getContainer(
QWindow *
window)
107emscripten::val QWasmAccessibility::getContainer(QAccessibleInterface *iface)
110 return emscripten::val::undefined();
111 return getContainer(getWindow(iface));
114QWindow *QWasmAccessibility::getWindow(QAccessibleInterface *iface)
123emscripten::val QWasmAccessibility::getDocument(
const emscripten::val &container)
125 if (container.isUndefined())
126 return emscripten::val::global(
"document");
127 return container[
"ownerDocument"];
130emscripten::val QWasmAccessibility::getDocument(QAccessibleInterface *iface)
132 return getDocument(getContainer(iface));
135emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *iface)
140 emscripten::val container = getContainer(iface);
144 emscripten::val
document = getDocument(container);
151 emscripten::val element = emscripten::val::undefined();
153 switch (
iface->role()) {
155 case QAccessible::Button: {
156 element =
document.call<emscripten::val>(
"createElement", std::string(
"button"));
157 element.call<
void>(
"addEventListener", emscripten::val(
"click"),
158 emscripten::val::module_property(
"qtEventReceived"),
true);
160 case QAccessible::CheckBox: {
161 element =
document.call<emscripten::val>(
"createElement", std::string(
"input"));
162 element.call<
void>(
"setAttribute", std::string(
"type"), std::string(
"checkbox"));
163 if (
iface->state().checked) {
164 element.call<
void>(
"setAttribute", std::string(
"checked"), std::string(
"true"));
166 element.call<
void>(
"addEventListener", emscripten::val(
"change"),
167 emscripten::val::module_property(
"qtEventReceived"),
true);
171 case QAccessible::RadioButton: {
172 element =
document.call<emscripten::val>(
"createElement", std::string(
"input"));
173 element.call<
void>(
"setAttribute", std::string(
"type"), std::string(
"radio"));
174 if (
iface->state().checked) {
175 element.call<
void>(
"setAttribute", std::string(
"checked"), std::string(
"true"));
177 element.set(std::string(
"name"), std::string(
"buttonGroup"));
178 element.call<
void>(
"addEventListener", emscripten::val(
"change"),
179 emscripten::val::module_property(
"qtEventReceived"),
true);
182 case QAccessible::SpinBox: {
183 element =
document.call<emscripten::val>(
"createElement", std::string(
"input"));
184 element.call<
void>(
"setAttribute", std::string(
"type"), std::string(
"number"));
185 std::string valueString =
iface->valueInterface()->currentValue().toString().toStdString();
186 element.call<
void>(
"setAttribute", std::string(
"value"), valueString);
187 element.call<
void>(
"addEventListener", emscripten::val(
"change"),
188 emscripten::val::module_property(
"qtEventReceived"),
true);
191 case QAccessible::Slider: {
192 element =
document.call<emscripten::val>(
"createElement", std::string(
"input"));
193 element.call<
void>(
"setAttribute", std::string(
"type"), std::string(
"range"));
194 std::string valueString =
iface->valueInterface()->currentValue().toString().toStdString();
195 element.call<
void>(
"setAttribute", std::string(
"value"), valueString);
196 element.call<
void>(
"addEventListener", emscripten::val(
"change"),
197 emscripten::val::module_property(
"qtEventReceived"),
true);
200 case QAccessible::PageTabList:{
201 element =
document.call<emscripten::val>(
"createElement", std::string(
"div"));
202 element.call<
void>(
"setAttribute", std::string(
"role"), std::string(
"tablist"));
203 QString idName =
iface->text(QAccessible::Name).replace(
" ",
"_");
204 idName +=
"_tabList";
205 element.call<
void>(
"setAttribute", std::string(
"id"), idName.toStdString());
207 for (
int i = 0;
i <
iface->childCount(); ++
i) {
208 if (
iface->child(
i)->role() == QAccessible::PageTab){
209 emscripten::val elementTab = emscripten::val::undefined();
210 elementTab = ensureHtmlElement(
iface->child(
i));
211 elementTab.call<
void>(
"setAttribute", std::string(
"aria-owns"), idName.toStdString());
212 setHtmlElementGeometry(
iface->child(
i));
217 case QAccessible::PageTab:{
218 element =
document.call<emscripten::val>(
"createElement", std::string(
"button"));
219 element.call<
void>(
"setAttribute", std::string(
"role"), std::string(
"tab"));
221 element.call<
void>(
"setAttribute", std::string(
"title"),
text.
toStdString());
222 element.call<
void>(
"addEventListener", emscripten::val(
"click"),
223 emscripten::val::module_property(
"qtEventReceived"),
true);
226 case QAccessible::ScrollBar: {
227 element =
document.call<emscripten::val>(
"createElement", std::string(
"div"));
228 element.call<
void>(
"setAttribute", std::string(
"role"), std::string(
"scrollbar"));
229 std::string valueString =
iface->valueInterface()->currentValue().toString().toStdString();
230 element.call<
void>(
"setAttribute", std::string(
"aria-valuenow"), valueString);
231 element.call<
void>(
"addEventListener", emscripten::val(
"change"),
232 emscripten::val::module_property(
"qtEventReceived"),
true);
235 case QAccessible::StaticText: {
236 element =
document.call<emscripten::val>(
"createElement", std::string(
"textarea"));
237 element.call<
void>(
"setAttribute", std::string(
"readonly"), std::string(
"true"));
240 case QAccessible::Dialog: {
241 element =
document.call<emscripten::val>(
"createElement", std::string(
"dialog"));
243 case QAccessible::ToolBar:{
244 element =
document.call<emscripten::val>(
"createElement", std::string(
"div"));
247 element.call<
void>(
"setAttribute", std::string(
"role"), std::string(
"toolbar"));
248 element.call<
void>(
"setAttribute", std::string(
"title"),
text.
toStdString());
249 element.call<
void>(
"addEventListener", emscripten::val(
"click"),
250 emscripten::val::module_property(
"qtEventReceived"),
true);
252 case QAccessible::MenuItem:
253 case QAccessible::ButtonMenu: {
254 element =
document.call<emscripten::val>(
"createElement", std::string(
"button"));
257 element.call<
void>(
"setAttribute", std::string(
"role"), std::string(
"menuitem"));
258 element.call<
void>(
"setAttribute", std::string(
"title"),
text.
toStdString());
259 element.call<
void>(
"addEventListener", emscripten::val(
"click"),
260 emscripten::val::module_property(
"qtEventReceived"),
true);
262 case QAccessible::MenuBar:
263 case QAccessible::PopupMenu: {
264 element =
document.call<emscripten::val>(
"createElement",std::string(
"div"));
266 element.call<
void>(
"setAttribute", std::string(
"role"), std::string(
"menubar"));
267 element.call<
void>(
"setAttribute", std::string(
"title"),
text.
toStdString());
268 for (
int i = 0;
i <
iface->childCount(); ++
i) {
269 emscripten::val childElement = emscripten::val::undefined();
270 childElement= ensureHtmlElement(
iface->child(
i));
271 childElement.call<
void>(
"setAttribute", std::string(
"aria-owns"),
text.
toStdString());
272 setHtmlElementTextName(
iface->child(
i));
273 setHtmlElementGeometry(
iface->child(
i));
276 case QAccessible::EditableText: {
277 element =
document.call<emscripten::val>(
"createElement", std::string(
"input"));
278 element.call<
void>(
"setAttribute", std::string(
"type"),std::string(
"text"));
279 element.call<
void>(
"addEventListener", emscripten::val(
"input"),
280 emscripten::val::module_property(
"qtEventReceived"),
true);
283 qCDebug(lcQpaAccessibility) <<
"TODO: createHtmlElement() handle" <<
iface->role();
284 element =
document.call<emscripten::val>(
"createElement", std::string(
"div"));
293 if (!container.isUndefined())
294 container.call<
void>(
"appendChild", element);
299void QWasmAccessibility::destroyHtmlElement(QAccessibleInterface *iface)
302 qCDebug(lcQpaAccessibility) <<
"TODO destroyHtmlElement";
305emscripten::val QWasmAccessibility::ensureHtmlElement(QAccessibleInterface *iface)
307 auto it = m_elements.
find(iface);
308 if (
it != m_elements.
end())
311 emscripten::val element = createHtmlElement(iface);
312 m_elements.insert(iface, element);
317void QWasmAccessibility::setHtmlElementVisibility(QAccessibleInterface *iface,
bool visible)
319 emscripten::val element = ensureHtmlElement(iface);
320 emscripten::val container = getContainer(iface);
322 if (container.isUndefined()) {
323 qCDebug(lcQpaAccessibility) <<
"TODO: setHtmlElementVisibility: unable to find html container for element" <<
iface;
327 container.call<
void>(
"appendChild", element);
329 element.set(
"ariaHidden", !visible);
332void QWasmAccessibility::setHtmlElementGeometry(QAccessibleInterface *iface)
334 emscripten::val element = ensureHtmlElement(iface);
340 qCWarning(lcQpaAccessibility) <<
"Unable to find window for" <<
iface <<
"setting null geometry";
343 QRect windowGeometry(windowPos, screenGeometry.
size());
345 setHtmlElementGeometry(element, windowGeometry);
348void QWasmAccessibility::setHtmlElementGeometry(emscripten::val element,
QRect geometry)
352 emscripten::val style = element[
"style"];
353 style.set(
"position", std::string(
"absolute"));
354 style.set(
"z-index", std::string(
"-1"));
356 style.set(
"left", std::to_string(geometry.
x()) +
"px");
357 style.set(
"top", std::to_string(geometry.
y()) +
"px");
358 style.set(
"width", std::to_string(geometry.
width()) +
"px");
359 style.set(
"height", std::to_string(geometry.
height()) +
"px");
362void QWasmAccessibility::setHtmlElementTextName(QAccessibleInterface *iface)
364 emscripten::val element = ensureHtmlElement(iface);
369void QWasmAccessibility::setHtmlElementTextNameLE(QAccessibleInterface *iface) {
370 emscripten::val element = ensureHtmlElement(iface);
372 element.call<
void>(
"setAttribute", std::string(
"name"),
text.
toStdString());
374 element.set(
"innerHTML",
value.toStdString());
377void QWasmAccessibility::setHtmlElementDescription(QAccessibleInterface *iface) {
378 emscripten::val element = ensureHtmlElement(iface);
380 element.call<
void>(
"setAttribute", std::string(
"aria-description"),
desc.toStdString());
383void QWasmAccessibility::handleStaticTextUpdate(QAccessibleEvent *
event)
385 switch (
event->type()) {
386 case QAccessible::NameChanged: {
387 setHtmlElementTextName(
event->accessibleInterface());
389 case QAccessible::DescriptionChanged: {
390 setHtmlElementDescription(
event->accessibleInterface());
393 qCDebug(lcQpaAccessibility) <<
"TODO: implement handleStaticTextUpdate for event" <<
event->type();
398void QWasmAccessibility::handleLineEditUpdate(QAccessibleEvent *
event) {
400 switch (
event->type()) {
401 case QAccessible::NameChanged: {
402 setHtmlElementTextName(
event->accessibleInterface());
404 case QAccessible::Focus:
405 case QAccessible::TextRemoved:
406 case QAccessible::TextInserted:
407 case QAccessible::TextCaretMoved: {
408 setHtmlElementTextNameLE(
event->accessibleInterface());
410 case QAccessible::DescriptionChanged: {
411 setHtmlElementDescription(
event->accessibleInterface());
414 qCDebug(lcQpaAccessibility) <<
"TODO: implement handleLineEditUpdate for event" <<
event->type();
419void QWasmAccessibility::handleEventFromHtmlElement(
const emscripten::val
event)
422 QAccessibleInterface *
iface = m_elements.key(
event[
"target"]);
423 if (iface ==
nullptr) {
428 if (actionNames.contains(QAccessibleActionInterface::pressAction())) {
430 iface->actionInterface()->doAction(QAccessibleActionInterface::pressAction());
432 }
else if (actionNames.contains(QAccessibleActionInterface::toggleAction())) {
434 iface->actionInterface()->doAction(QAccessibleActionInterface::toggleAction());
436 }
else if (actionNames.contains(QAccessibleActionInterface::increaseAction()) ||
437 actionNames.contains(QAccessibleActionInterface::decreaseAction())) {
441 iface->valueInterface()->setCurrentValue(
val.toInt());
443 }
else if (eventType ==
"input") {
448 if (
iface->editableTextInterface() ||
iface->role() == QAccessible::EditableText) {
449 std::string insertText =
event[
"target"][
"value"].as<std::string>();
456void QWasmAccessibility::handleButtonUpdate(QAccessibleEvent *
event)
458 qCDebug(lcQpaAccessibility) <<
"TODO: implement handleButtonUpdate for event" <<
event->type();
461void QWasmAccessibility::handleCheckBoxUpdate(QAccessibleEvent *
event)
463 switch (
event->type()) {
464 case QAccessible::Focus:
465 case QAccessible::NameChanged: {
466 setHtmlElementTextName(
event->accessibleInterface());
468 case QAccessible::StateChanged: {
469 QAccessibleInterface *accessible =
event->accessibleInterface();
470 emscripten::val element = ensureHtmlElement(accessible);
471 bool checkedString = accessible->state().checked ? true :
false;
472 element.call<
void>(
"setAttribute", std::string(
"checked"), checkedString);
474 case QAccessible::DescriptionChanged: {
475 setHtmlElementDescription(
event->accessibleInterface());
478 qCDebug(lcQpaAccessibility) <<
"TODO: implement handleCheckBoxUpdate for event" <<
event->type();
482void QWasmAccessibility::handleToolUpdate(QAccessibleEvent *
event)
484 QAccessibleInterface *
iface =
event->accessibleInterface();
487 switch (
event->type()) {
488 case QAccessible::NameChanged:
489 case QAccessible::StateChanged:{
490 emscripten::val element = ensureHtmlElement(iface);
491 element.call<
void>(
"setAttribute", std::string(
"title"),
text.
toStdString());
493 case QAccessible::DescriptionChanged: {
494 setHtmlElementDescription(
event->accessibleInterface());
497 qCDebug(lcQpaAccessibility) <<
"TODO: implement handleToolUpdate for event" <<
event->type();
501void QWasmAccessibility::handleMenuUpdate(QAccessibleEvent *
event)
503 QAccessibleInterface *
iface =
event->accessibleInterface();
506 switch (
event->type()) {
507 case QAccessible::Focus:
508 case QAccessible::NameChanged:
509 case QAccessible::MenuStart :
510 case QAccessible::PopupMenuStart:
511 case QAccessible::StateChanged:{
512 emscripten::val element = ensureHtmlElement(iface);
513 element.call<
void>(
"setAttribute", std::string(
"title"),
text.
toStdString());
515 case QAccessible::DescriptionChanged: {
516 setHtmlElementDescription(
event->accessibleInterface());
519 qCDebug(lcQpaAccessibility) <<
"TODO: implement handleMenuUpdate for event" <<
event->type();
523void QWasmAccessibility::handleDialogUpdate(QAccessibleEvent *
event) {
525 switch (
event->type()) {
526 case QAccessible::NameChanged:
527 case QAccessible::Focus:
528 case QAccessible::DialogStart:
529 case QAccessible::StateChanged: {
530 setHtmlElementTextName(
event->accessibleInterface());
532 case QAccessible::DescriptionChanged: {
533 setHtmlElementDescription(
event->accessibleInterface());
536 qCDebug(lcQpaAccessibility) <<
"TODO: implement handleLineEditUpdate for event" <<
event->type();
541void QWasmAccessibility::populateAccessibilityTree(QAccessibleInterface *iface)
547 ensureHtmlElement(iface);
548 const bool visible = !
iface->state().invisible;
549 setHtmlElementVisibility(iface, visible);
550 setHtmlElementGeometry(iface);
551 setHtmlElementTextName(iface);
552 setHtmlElementDescription(iface);
554 for (
int i = 0;
i <
iface->childCount(); ++
i)
555 populateAccessibilityTree(
iface->child(
i));
558void QWasmAccessibility::handleRadioButtonUpdate(QAccessibleEvent *
event)
560 switch (
event->type()) {
561 case QAccessible::Focus:
562 case QAccessible::NameChanged: {
563 setHtmlElementTextName(
event->accessibleInterface());
565 case QAccessible::StateChanged: {
566 QAccessibleInterface *accessible =
event->accessibleInterface();
567 emscripten::val element = ensureHtmlElement(accessible);
568 std::string checkedString = accessible->state().checked ?
"true" :
"false";
569 element.call<
void>(
"setAttribute", std::string(
"checked"), checkedString);
571 case QAccessible::DescriptionChanged: {
572 setHtmlElementDescription(
event->accessibleInterface());
575 qDebug() <<
"TODO: implement handleRadioButtonUpdate for event" <<
event->type();
580void QWasmAccessibility::handleSpinBoxUpdate(QAccessibleEvent *
event)
582 switch (
event->type()) {
583 case QAccessible::Focus:
584 case QAccessible::NameChanged: {
585 setHtmlElementTextName(
event->accessibleInterface());
587 case QAccessible::ValueChanged: {
588 QAccessibleInterface *accessible =
event->accessibleInterface();
589 emscripten::val element = ensureHtmlElement(accessible);
590 std::string valueString = accessible->valueInterface()->currentValue().toString().toStdString();
591 element.call<
void>(
"setAttribute", std::string(
"value"), valueString);
593 case QAccessible::DescriptionChanged: {
594 setHtmlElementDescription(
event->accessibleInterface());
597 qDebug() <<
"TODO: implement handleSpinBoxUpdate for event" <<
event->type();
602void QWasmAccessibility::handleSliderUpdate(QAccessibleEvent *
event)
604 switch (
event->type()) {
605 case QAccessible::Focus:
606 case QAccessible::NameChanged: {
607 setHtmlElementTextName(
event->accessibleInterface());
609 case QAccessible::ValueChanged: {
610 QAccessibleInterface *accessible =
event->accessibleInterface();
611 emscripten::val element = ensureHtmlElement(accessible);
612 std::string valueString = accessible->valueInterface()->currentValue().toString().toStdString();
613 element.call<
void>(
"setAttribute", std::string(
"value"), valueString);
615 case QAccessible::DescriptionChanged: {
616 setHtmlElementDescription(
event->accessibleInterface());
619 qDebug() <<
"TODO: implement handleSliderUpdate for event" <<
event->type();
624void QWasmAccessibility::handleScrollBarUpdate(QAccessibleEvent *
event)
626 switch (
event->type()) {
627 case QAccessible::Focus:
628 case QAccessible::NameChanged: {
629 setHtmlElementTextName(
event->accessibleInterface());
631 case QAccessible::ValueChanged: {
632 QAccessibleInterface *accessible =
event->accessibleInterface();
633 emscripten::val element = ensureHtmlElement(accessible);
634 std::string valueString = accessible->valueInterface()->currentValue().toString().toStdString();
635 element.call<
void>(
"setAttribute", std::string(
"aria-valuenow"), valueString);
637 case QAccessible::DescriptionChanged: {
638 setHtmlElementDescription(
event->accessibleInterface());
641 qDebug() <<
"TODO: implement handleSliderUpdate for event" <<
event->type();
647void QWasmAccessibility::handlePageTabUpdate(QAccessibleEvent *
event)
649 switch (
event->type()) {
650 case QAccessible::NameChanged: {
651 setHtmlElementTextName(
event->accessibleInterface());
653 case QAccessible::Focus: {
654 setHtmlElementTextName(
event->accessibleInterface());
656 case QAccessible::DescriptionChanged: {
657 setHtmlElementDescription(
event->accessibleInterface());
660 qDebug() <<
"TODO: implement handlePageTabUpdate for event" <<
event->type();
665void QWasmAccessibility::handlePageTabListUpdate(QAccessibleEvent *
event)
667 switch (
event->type()) {
668 case QAccessible::NameChanged: {
669 setHtmlElementTextName(
event->accessibleInterface());
671 case QAccessible::Focus: {
672 setHtmlElementTextName(
event->accessibleInterface());
674 case QAccessible::DescriptionChanged: {
675 setHtmlElementDescription(
event->accessibleInterface());
678 qDebug() <<
"TODO: implement handlePageTabUpdate for event" <<
event->type();
683void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *
event)
685 if (!m_accessibilityEnabled)
688 QAccessibleInterface *
iface =
event->accessibleInterface();
690 qWarning() <<
"notifyAccessibilityUpdate with null a11y interface" ;
696 switch (
event->type()) {
697 case QAccessible::ObjectShow:
698 setHtmlElementVisibility(iface,
true);
701 setHtmlElementGeometry(iface);
702 setHtmlElementTextName(iface);
703 setHtmlElementDescription(iface);
707 case QAccessible::ObjectHide:
708 setHtmlElementVisibility(iface,
false);
718 switch (
iface->role()) {
719 case QAccessible::StaticText:
720 handleStaticTextUpdate(
event);
722 case QAccessible::Button:
723 handleStaticTextUpdate(
event);
725 case QAccessible::CheckBox:
726 handleCheckBoxUpdate(
event);
728 case QAccessible::EditableText:
729 handleLineEditUpdate(
event);
731 case QAccessible::Dialog:
732 handleDialogUpdate(
event);
734 case QAccessible::MenuItem:
735 case QAccessible::MenuBar:
736 case QAccessible::PopupMenu:
737 handleMenuUpdate(
event);
739 case QAccessible::ToolBar:
740 case QAccessible::ButtonMenu:
741 handleToolUpdate(
event);
742 case QAccessible::RadioButton:
743 handleRadioButtonUpdate(
event);
745 case QAccessible::SpinBox:
746 handleSpinBoxUpdate(
event);
748 case QAccessible::Slider:
749 handleSliderUpdate(
event);
751 case QAccessible::PageTab:
752 handlePageTabUpdate(
event);
754 case QAccessible::PageTabList:
755 handlePageTabListUpdate(
event);
757 case QAccessible::ScrollBar:
758 handleScrollBarUpdate(
event);
761 qCDebug(lcQpaAccessibility) <<
"TODO: implement notifyAccessibilityUpdate for role" <<
iface->role();
765void QWasmAccessibility::setRootObject(
QObject *root)
770void QWasmAccessibility::initialize()
775void QWasmAccessibility::cleanup()
780void QWasmAccessibility::onHtmlEventReceived(emscripten::val
event)
786 function(
"qtEventReceived", &QWasmAccessibility::onHtmlEventReceived);
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
constexpr int height() const noexcept
Returns the height of the rectangle.
constexpr QPoint topLeft() const noexcept
Returns the position of the rectangle's top-left corner.
constexpr int x() const noexcept
Returns the x-coordinate of the rectangle's left edge.
constexpr QSize size() const noexcept
Returns the size of the rectangle.
constexpr int width() const noexcept
Returns the width of the rectangle.
constexpr int y() const noexcept
Returns the y-coordinate of the rectangle's top edge.
iterator find(const T &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromStdString(const std::string &s)
std::string toStdString() const
Returns a std::string object with the data contained in this QString.
static QWasmIntegration * get()
QSet< QString >::iterator it
QStringList effectiveActionNames(QAccessibleInterface *iface)
constexpr QBindableInterface iface
emscripten::val document()
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
static QDBusError::ErrorType get(const char *name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
EMSCRIPTEN_BINDINGS(qtClipboardModule)