【问题标题】:How to change screen resolution using QT, OpenGL, C++, and Linux?如何使用 QT、OpenGL、C++ 和 Linux 更改屏幕分辨率?
【发布时间】:2012-07-08 10:03:20
【问题描述】:

我只是想做一个全屏游戏。我知道如何在 Windows 上更改分辨率,但如何在 Linux 下更改分辨率?是否有针对此的跨平台 QT 解决方案?我的 GLWidget 周围也有边框。如何让小部件覆盖整个窗口?

我只是要发布代码:

#include <QtOpenGL>

class GLWidget : public QGLWidget
{
public:
    void initializeGL()
    {
        glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
        glClearDepth(1.0f);
    }

    void paintGL()
    {
        glClear(GL_COLOR_BUFFER_BIT);
    }

    void resizeGL(int width, int height)
    {
        int side = qMin(width, height);
        glViewport((width - side) / 2, (height - side) / 2, side, side);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-0.5f, +0.5f, -0.5f, +0.5f, 4.0f, 15.0f);
        glMatrixMode(GL_MODELVIEW);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QDesktopWidget *desktop = app.desktop();
    QWidget window;
    GLWidget *glWidget = new GLWidget;
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(glWidget);
    window.setLayout(mainLayout);
    window.setWindowTitle("Hello GL");
    window.resize(QSize(640, 480));
    window.show();
    window.showFullScreen();
    return app.exec();
}

【问题讨论】:

  • SDL 可能是比 Qt 更好的游戏工具包。
  • 看看xrandr
  • 实际上是在 Windows 上。这并不能回答我的问题。我最好的猜测是我需要使用 x window api 来做到这一点。然而,这引出了一个问题,如果我无论如何都要使用平台窗口库,为什么不首先使用它呢?另外我真的需要知道如何从 glwidget 中删除边框。
  • 设置布局边距似乎可以解决边框问题,但我不确定这是否是最好的方法。反正我可以直接渲染到窗口吗?

标签: c++ linux qt opengl


【解决方案1】:

您可以使用xrrsetscreenconfigandrate,如here 所述:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<X11/Xlib.h>
#include<X11/extensions/Xrandr.h>

Display                 *dpy;
Window                  root;
int                     num_sizes;
XRRScreenSize           *xrrs;
XRRScreenConfiguration  *conf;
short                   possible_frequencies[64][64];
short                   original_rate;
Rotation                original_rotation;
SizeID                  original_size_id;

int main(int argc, char *argv[]){
 //
 //     CONNECT TO X-SERVER, GET ROOT WINDOW ID
 //
 dpy    = XOpenDisplay(NULL);
 root   = RootWindow(dpy, 0);
 //
 //     GET POSSIBLE SCREEN RESOLUTIONS
 //
 xrrs   = XRRSizes(dpy, 0, &num_sizes);
 //
 //     LOOP THROUGH ALL POSSIBLE RESOLUTIONS,
 //     GETTING THE SELECTABLE DISPLAY FREQUENCIES
 //
 for(int i = 0; i < num_sizes; i ++) {
        short   *rates;
        int     num_rates;

        printf("\n\t%2i : %4i x %4i   (%4imm x%4imm ) ", i, xrrs[i].width, xrrs[i].height, xrrs[i].mwidth, xrrs[i].mheight);

        rates = XRRRates(dpy, 0, i, &num_rates);

        for(int j = 0; j < num_rates; j ++) {
                possible_frequencies[i][j] = rates[j];
                printf("%4i ", rates[j]); } }

 printf("\n");
 //
 //     GET CURRENT RESOLUTION AND FREQUENCY
 //
 conf                   = XRRGetScreenInfo(dpy, root);
 original_rate          = XRRConfigCurrentRate(conf);
 original_size_id       = XRRConfigCurrentConfiguration(conf, &original_rotation);

 printf("\n\tCURRENT SIZE ID  : %i\n", original_size_id);
 printf("\tCURRENT ROTATION : %i \n", original_rotation);
 printf("\tCURRENT RATE     : %i Hz\n\n", original_rate);
 //
 //     CHANGE RESOLUTION
 //
 printf("\tCHANGED TO %i x %i PIXELS, %i Hz\n\n", xrrs[1].width, xrrs[1].height, possible_frequencies[1][0]);
 XRRSetScreenConfigAndRate(dpy, conf, root, 1, RR_Rotate_0, possible_frequencies[1][0], CurrentTime);
 //
 //     SLEEP A WHILE
 //
 usleep(6000000);
 //
 //     RESTORE ORIGINAL CONFIGURATION
 //
 printf("\tRESTORING %i x %i PIXELS, %i Hz\n\n", xrrs[original_size_id].width, xrrs[original_size_id].height, original_rate);
 XRRSetScreenConfigAndRate(dpy, conf, root, original_size_id, original_rotation, original_rate, CurrentTime);
 //
 //     EXIT
 //
 XCloseDisplay(dpy); }
//
//      gcc -o Xrandr Xrandr.cc -lX11 -lXrandr -lstdc++
//

【讨论】:

  • 这似乎是最好的解决方案。谢谢你好先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多