2012-07-09 97 views
6

Tôi chỉ muốn tạo một trò chơi toàn màn hình. Tôi biết cách thay đổi độ phân giải trên Windows nhưng làm cách nào để thay đổi độ phân giải trong Linux? Có một giải pháp QT nền tảng cho việc này không? Ngoài ra tôi đã có biên giới xung quanh GLWidget của tôi. Làm thế nào để làm cho các widget bao gồm toàn bộ cửa sổ?Làm thế nào để thay đổi độ phân giải màn hình bằng QT, OpenGL, C++ và Linux?

Tôi chỉ sẽ gửi mã:

#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 có lẽ là một bộ công cụ tốt hơn cho các trò chơi hơn Qt. –

+2

Hãy xem [xrandr] (http://www.thinkwiki.org/wiki/Xorg_RandR_1.2). – Linuxios

+0

Ai đó [đã yêu cầu điều này] (http://stackoverflow.com/questions/3372252/changing-the-screen-resolution-from-qt). – sashoalm

Trả lời

3

Bạn có thể sử dụng xrrsetscreenconfigandrate, như được giải thích 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

Đó dường như là giải pháp tốt nhất. Cảm ơn bạn tốt! – SteveDeFacto

Các vấn đề liên quan