2012-08-06 18 views
7

Ich versuche, eine GUI-Anwendung zu erstellen.Qt GUI-Design programmgesteuert

Das Hauptfenster, ein QMainWindow, enthält 9 Etiketten mit fester Größe und auch die Größe des Hauptfensters.

Ich habe versucht, es ohne Qt GUI Designer programmgesteuert zu machen. Das Projekt wird ohne Fehler erstellt, aber ich kann weder eine Beschriftung noch ein Layout im Hauptfenster sehen. es ist nur leer.

Hier mein Quellcode ist:

WCwindow::WCwindow() 
{ 
    // initialize widgets with text 
    CAM111 = new QLabel("CAM 01"); 
    CAM121 = new QLabel("CAM 02"); 
    CAM131 = new QLabel("CAM 03"); 

    CAM211 = new QLabel("CAM 04"); 
    CAM221 = new QLabel("CAM 05"); 
    CAM231 = new QLabel("CAM 06"); 

    CAM311 = new QLabel("CAM 07"); 
    CAM321 = new QLabel("CAM 08"); 
    CAM331 = new QLabel("CAM 09"); 

    CAM111->setFixedSize(wcW,wcH); 
    CAM121->setFixedSize(wcW,wcH); 
    CAM131->setFixedSize(wcW,wcH); 
    CAM211->setFixedSize(wcW,wcH); 
    CAM221->setFixedSize(wcW,wcH); 
    CAM231->setFixedSize(wcW,wcH); 
    CAM311->setFixedSize(wcW,wcH); 
    CAM321->setFixedSize(wcW,wcH); 
    CAM331->setFixedSize(wcW,wcH); 

    QGridLayout *layout = new QGridLayout; 
    layout->addWidget(CAM111,0,0); 
    layout->addWidget(CAM121,0,1); 
    layout->addWidget(CAM131,0,2); 

    layout->addWidget(CAM211,1,0); 
    layout->addWidget(CAM221,1,1); 
    layout->addWidget(CAM231,1,2); 

    layout->addWidget(CAM311,2,0); 
    layout->addWidget(CAM321,2,1); 
    layout->addWidget(CAM331,2,2); 

    setLayout(layout); 

    setWindowTitle("Camera Window"); 
    setFixedSize(1000, 800); 

} 

natürlich wird die Klasse initialisiert und in main.cpp evozierte:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    WCwindow *WCwin = new WCwindow; 

    WCwin->show(); 

    return app.exec(); 
} 

, welche Art von Fehler habe ich ??

+2

Feste Größen sind eine schlechte Idee, da System/Benutzerabhängige Schriftgrößen, Übersetzungen usw. Wie lauten die Werte von wcW und wcH? –

+0

Btw, wenn Sie die setFixedSize auf den Etiketten überspringen, sollte es mindestens so gut funktionieren. –

+0

Dies liegt daran, dass die Größe des aufgenommenen Bildes von der Webcam eine feste Größe hat. Die Etiketten sind die Halter für diese Bilder erfassen –

Antwort

4

Der folgende Code funktioniert einwandfrei. Das Problem lag in dem Code, den du nicht angezeigt hast. Wenn Sie eine QMainWindow verwenden, wie Sie schließlich zugelassen haben, müssen Sie centralWidget mit einem neuen Widget, das Sie erstellen, festlegen.

// main.cpp 
#include <QVector> 
#include <QMainWindow> 
#include <QLabel> 
#include <QGridLayout> 
#include <QApplication> 

class WCwindow : public QMainWindow 
{ 
public: 
    WCwindow(); 
private: 
    QVector<QLabel*> cams; 
    QLabel* cam(int r, int c) const { 
     return cams[r*3 + c]; 
    } 
}; 

WCwindow::WCwindow() 
{ 
    QGridLayout *layout = new QGridLayout; 

    for (int i = 1; i < 10; ++ i) { 
     QLabel * const label = new QLabel(QString("CAM %1").arg(i, 2, 10, QLatin1Char('0'))); 
     label->setFixedSize(200, 50); 
     layout->addWidget(label, (i-1)/3, (i-1) % 3); 
     cams << label; 
    } 

    QWidget * central = new QWidget(); 
    setCentralWidget(central); 
    centralWidget()->setLayout(layout); 

    setWindowTitle("Camera Window"); 
    setFixedSize(1000, 800); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    WCwindow win; 
    win.show(); 
    return app.exec(); 
} 
+0

danke! Ich habe Ihren Code ausgeführt und es hat gut funktioniert. und ich habe auch gelernt, dass dies bei QMainWindow nicht der Fall ist, was mein Fall ist. Ich ändere meine Klasse in eine QWidget-Unterklasse und es ist OK –

+0

In einem 'QMainWindow' müssen Sie mit seinem' centralWidget() 'arbeiten. Ich habe den Code entsprechend geändert. –

1

Ist WCwindow eine Unterklasse von QMainWindow? In diesem Fall würde rät ich durch Klicken auf die „Pause Layout“ Button in der oberen Leiste das Layout aus dem Fenster in dem GUI-Editor zu entfernen, dann verwenden Sie das folgende:

//setup all your labels and layout ... 

//creating a QWidget, and setting the WCwindow as parent 
QWidget * widget = new QWidget(this); 

//set the gridlayout for the widget 
widget->setLayout(layout); 

//setting the WCwindow's central widget 
setCentralWidget(widget); 
+0

danke! Das ist die Antwort, nach der ich gesucht habe. es traf mein Problem –

+0

Sie sind willkommen! –

+0

Ich kann nicht 2 Antworten wählen ?? –

Verwandte Themen