【问题标题】:QT 5 Application Crashes With No MonitorQT 5 应用程序在没有监视器的情况下崩溃
【发布时间】:2013-05-21 02:25:41
【问题描述】:

我正在使用 Qt 5 库在 CentOS 6.4 上运行 Qt 桌面应用程序。

当我从 VNC 启动应用程序时,由于我们的一些服务器没有监视器,应用程序崩溃了。起点:

QApplication a(argc, argv);

我已将其追踪到一个核心文件调用 qxcbconnection.cpp 和行:

xcb_create_window(m_connection, XCB_COPY_FROM_PARENT,
                  m_connectionEventListener, m_screens.at(0)->root(),
                  0, 0, 1, 1, 0, XCB_WINDOW_CLASS_INPUT_ONLY,
                  m_screens.at(0)->screen()->root_visual, 0, 0);

问题是,如果没有连接监视器,那么 m_screens 是空的,因此会导致“索引超出范围”错误。

我的问题是:有没有办法解决这个问题,或者以某种方式模仿监视器?

【问题讨论】:

  • 它是 GUI 应用程序吗??
  • 是的。使用 Qt5 之前的版本,我可以在带有和不带有监视器的服务器上使用相同的 GUI 应用程序。我希望在这里也一样。

标签: qt qt5 xcb


【解决方案1】:

您可能在 Qt 中发现了一个回归错误,因为我在 Qt4 to Qt5 changelogQtApplication documentation 中都找不到任何相关内容。恕我直言,它不应该崩溃,而应该只做不必要的工作(比如在 Qt4 中)。但是,您可以选择要创建的实例类型。该文档给出了一个最小的例子:

QCoreApplication* createApplication(int &argc, char *argv[])
{
    for (int i = 1; i < argc; ++i)
        if (!qstrcmp(argv[i], "-no-gui"))
            return new QCoreApplication(argc, argv);
    return new QApplication(argc, argv);
}

int main(int argc, char* argv[])
{
    QScopedPointer<QCoreApplication> app(createApplication(argc, argv));

    if (qobject_cast<QApplication *>(app.data())) {
       // start GUI version...
    } else {
       // start non-GUI version...
    }

    return app->exec();
}

Ps :请注意QApplication 在幕后经历了重大变化,即使 API 没有发生太大变化。

【讨论】:

  • 使用非 GUI 版本的唯一问题是我无法使用内置设置菜单或查看图形仪表等。其中是当我通过 vnc/teamviewer 连接时显示的。
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多