2012-07-09 21 views
6

Solo quiero hacer un juego de pantalla completa. Sé cómo cambiar la resolución en Windows, pero ¿cómo puedo cambiar la resolución en Linux? ¿Hay una solución QT multiplataforma para esto? También tengo bordes alrededor de mi GLWidget. ¿Cómo hago que el widget cubra toda la ventana?¿Cómo cambiar la resolución de la pantalla usando QT, OpenGL, C++ y Linux?

sólo voy a publicar el código:

#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(); 
} 
+3

SDL es probablemente un mejor conjunto de herramientas para juegos que Qt. –

+2

Eche un vistazo a [xrandr] (http://www.thinkwiki.org/wiki/Xorg_RandR_1.2). – Linuxios

+0

Alguien [ya ha preguntado esto] (http://stackoverflow.com/questions/3372252/change-the-screen-resolution-from-qt). – sashoalm

Respuesta

3

Usted puede utilizar xrrsetscreenconfigandrate, como se explica 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++ 
// 
+0

Esa parece ser la mejor solución. ¡Gracias, señor! – SteveDeFacto

Cuestiones relacionadas