QDesktopWidget для отображения X

У меня на дисплее X говорят: 2. Я хочу отобразить мой виджет QT на данном X
дисплей. Этот дисплей отличается от основного дисплея. Поэтому в дополнение к основному дисплею (который задается переменной окружения DISPLAY) я хочу получить доступ к дополнительному дисплею X

Я знаю, что QDekstopWidget имеет функцию экрана (). Это не то, что я хочу. я
особый случай, когда я хочу получить прямой доступ к X Display с помощью
отображать идентификатор

Дайте мне знать, если есть что сделать.
Обновление: пробовал это

#include<QApplication>
#include<QWidget>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xresource.h>int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Display* display = XOpenDisplay(":1");

XSynchronize(display, True);
//XSetErrorHandler(myErrorHandler);

Window x11root = XDefaultRootWindow(display);

int x = 0;
int y = 0;
unsigned int width = 500;
unsigned int height = 500;
unsigned int borderWidth = 0;
long colorBlue = 0xff0000ff;

Window x11w = XCreateSimpleWindow(display, x11root, x, y,
width, height, borderWidth, 1 /*magic number*/, colorBlue);
XMapWindow(display, x11w); // must be performed after XReparentWindow,
// otherwise the window is not visible.

QWidget w;
w.resize(200,200);
w.show();

XReparentWindow(display, w.winId(), x11w, 0, 0);

return a.exec();

}

Пробовал qscreen test как предложено. Его обнаружение дисплея, но оба окна на дисплее: 3

shiva@RSV-HP-ENVY-15-Notebook-PC:/tmp/korvins-qtbase-6226fcdc3e4ace4636c58778ef53fbf69f46c36e-6226fcdc3e4ace4636c58778ef53fbf69f46c36e/tests/manual/qscreen$ ./qscreen -platform xcb::3::5
qt.core.logging: Loading "/home/shiva/.config/QtProject/qtlogging.ini" ...
qt.qpa.screen: Output VGA-1-0 is not connected
qt.qpa.screen: Output HDMI-1-0 is not connected
qt.qpa.screen: adding QXcbScreen(0x1b82f60, name="eDP-1-0", geometry=1366x768+0+0, availableGeometry=1309x744+57+24, devicePixelRatio=1.0, logicalDpi=QPair(96.0,96.0), physicalSize=344.0x194.0mm, screenNumber=0, virtualSize=1366x768 (1366.0x768.0mm), orientation=Qt::ScreenOrientation(LandscapeOrientation), depth=24, refreshRate=59.0, root=2c1, windowManagerName="Compiz") (Primary: true )
qt.qpa.screen: primary output is "eDP-1-0"qt.qpa.screen: connecting to additional display: "" "3"qt.qpa.screen: adding QXcbScreen(0x1bae540, name="TurboVNC", geometry=1024x716+0+0, availableGeometry=1024x664+0+28, devicePixelRatio=1.0, logicalDpi=QPair(96.0,96.0), physicalSize=271.0x189.0mm, screenNumber=0, virtualSize=1024x716 (1024.0x716.0mm), orientation=Qt::ScreenOrientation(LandscapeOrientation), depth=24, refreshRate=60.0, root=6a, windowManagerName="Metacity") (Primary: true )
qt.qpa.screen: primary output is "TurboVNC"qt.qpa.screen: connecting to additional display: "" "5"qt.qpa.screen: adding QXcbScreen(0x1bd6ca0, name="TurboVNC", geometry=1024x716+0+0, availableGeometry=1024x664+0+28, devicePixelRatio=1.0, logicalDpi=QPair(96.0,96.0), physicalSize=271.0x189.0mm, screenNumber=0, virtualSize=1024x716 (1024.0x716.0mm), orientation=Qt::ScreenOrientation(LandscapeOrientation), depth=24, refreshRate=60.0, root=6a, windowManagerName="Metacity") (Primary: true )
qt.qpa.screen: primary output is "TurboVNC"Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Could not initialize OpenGL for RasterGLSurface, reverting to RasterSurface.
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Could not initialize OpenGL for RasterGLSurface, reverting to RasterSurface.
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Xlib: extension "GLX" missing on display ":5".
Could not initialize OpenGL for RasterGLSurface, reverting to RasterSurface.

3

Решение

QX11Info предоставляет доступ к информации X Display. Ссылка: QX11Info :: дисплей ()

Я предполагаю, что вам нужно открыть второе X-соединение со вторым дисплеем и передать его вновь созданным виджетам.

Вот также некоторая информация.

2

Другие решения

Если вы посмотрите на конструктор QXcbConnection, m_displayName инициализируется к содержанию displayName параметр, если он не нулевой, или иначе DISPLAY переменная env, то она вызывает xcb_connect() с этим дисплеем, и с тех пор приложение Qt обычно общается только с этим дисплеем. Он не обнаруживает автоматически другие дисплеи. QXcbConnection создается в конструкторе QXcbIntegration, а он, в свою очередь, создается в QGuiApplication. init_platform функция. QXcbIntegration ищет -display аргумент командной строки тоже, так что это второй способ выбора отображения (переопределение DISPLAY переменная env).

Третий способ его настройки обеспечивается тем, что init_platform разделяет любые разделенные двоеточиями аргументы, которые добавляются к имени плагина платформы, которые в конечном итоге становятся параметрами QStringList для конструктора QXcbIntegration QXcbIntegration берет их по два за раз и создает дополнительные экземпляры QXcbConnection для каждой пары. Итак, если вы запустите свое приложение с -platform xcb::0.1::0.2, он будет подключаться к дисплеям: 0.1 и: 0.2 в дополнение к стандартному (который обычно исходит от DISPLAY переменная env). Однако, если вы укажете недопустимые дисплеи, произойдет сбой и произойдет, например, «не удалось подключиться к дисплею: ​​0,2».

Теперь попробуйте это с помощью ручного теста QScreen (при условии, что у вас есть отображаемые значения: 0 и: 0,1):

cd path/to/qtbase/tests/manual/qscreen
qmake
make
./qscreen -platform xcb::0.1

Вы получите окно на каждом выходе каждого дисплея, тогда как без каких-либо аргументов вы получите окно только на каждом выходе дисплея по умолчанию.

Вы также можете установить переменную env QPA_PLATFORM вместо того, чтобы дать -platform аргумент. И в вашем основном, вы могли бы даже использовать qputenv установить переменную env до конструирование QApplication, если вы хотите избежать необходимости настраивать переменную env в вашей оболочке. Если вы поймете, как обнаружить дисплеи, вы можете создать этот аргумент программно.

Как вы можете видеть в main.cpp ручного теста, QGuiApplication::screens() даст вам экземпляр QScreen для каждого выхода на каждом дисплее, к которому подключен Qt. Вы могли бы тогда использовать QScreen:name() или другие свойства, чтобы определить экран, который вы хотите использовать. Несколько выходов на одном дисплее обычно располагаются рядом, поэтому вызов setGeometry() для размещения окна обычно достаточно поместить его на тот или иной экран; но в вашем случае у вас есть несколько дисплеев, так что вам нужно также позвонить QWindow::setScreen() или же установите родительский виджет в виджет экрана соответствующего QDesktopWidget, как вы можете видеть в середине screenAdded() функция.

1

Если я правильно понимаю ваш вопрос, то у меня есть неприятное решение.
Вы можете настроить отображение вручную, указав ./app -display: 2
Если вы не можете этого сделать, вы можете изменить параметры командной строки в функции main (). Что-то вроде этого.

#include <QApplication>
#include <QWidget>
#include <cstdio>
#include <cstring>

int main(int argc, char** argv)
{
char** args = (char**)malloc((argc + 2) * sizeof(char*));
for(int i = 0; i < argc; ++i) {
int l = strlen(argv[i]);
args[i] = (char*)malloc(l * sizeof(char));
strcpy(args[i], argv[i]);
}
const char* const display = "-display_";
const char* const display_number = ":2_";
args[argc] = (char*)malloc(strlen(display) * sizeof(char));
args[argc + 1] = (char*)malloc(strlen(display_number) * sizeof(char));
strcpy(args[argc], display);
strcpy(args[argc + 1], display_number);
args[argc][strlen(display) - 1] = 0;
args[argc + 1][strlen(display_number) - 1] = 0;
for(int i = 0; i < argc + 2; ++i) {
printf("%s\t%d\n", args[i], strlen(args[i]));
}
int aargc = argc + 2;
QApplication app(aargc, args);
QWidget w;
w.show();
return app.exec();
}

Надеюсь, у вас есть идея. Пробовал на моей машине, и это сработало.

Благодарю.

0
По вопросам рекламы [email protected]