2012-07-09 12 views
6

Po prostu chcę zrobić grę pełnoekranową. Wiem, jak zmienić rozdzielczość w systemie Windows, ale jak mogę zmienić rozdzielczość w systemie Linux? Czy istnieje rozwiązanie cross-QT dla tego rozwiązania? Mam również granice wokół mojej GLWidget. Jak sprawić, by widget obejmował całe okno?Jak zmienić rozdzielczość ekranu za pomocą QT, OpenGL, C++ i Linux?

jestem po prostu zamiar opublikować kod:

#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 jest prawdopodobnie lepszy zestaw narzędzi do gier niż Qt. –

+2

Zobacz [xrandr] (http://www.thinkwiki.org/wiki/Xorg_RandR_1.2). – Linuxios

+0

Ktoś [już to zadał] (http://stackoverflow.com/questions/3372252/changing-the-screen-resolution-from-qt). – sashoalm

Odpowiedz

3

Można użyć xrrsetscreenconfigandrate, jak wyjaśniono 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

To wydaje się być najlepszym rozwiązaniem. Dziękuję, świetny panie! – SteveDeFacto

Powiązane problemy