2012-08-06 45 views
7

Tôi đang cố tạo ứng dụng GUI.Thiết kế GUI Qt lập trình

Cửa sổ chính, QMainWindow, chứa 9 nhãn có kích thước cố định và cũng có kích thước của cửa sổ chính.

Tôi đã cố gắng làm cho nó theo lập trình mà không cần Qt GUI Designer. Dự án được xây dựng không có lỗi nhưng tôi không thể thấy bất kỳ nhãn hoặc bố cục nào được hiển thị trên cửa sổ chính. nó chỉ là trống.

Đây là mã nguồn của tôi:

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); 

} 

tất nhiên, các lớp được khởi tạo và khơi dậy trong main.cpp:

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

    WCwindow *WCwin = new WCwindow; 

    WCwin->show(); 

    return app.exec(); 
} 

những loại lỗi tôi có ??

+2

Các kích thước cố định là một ý tưởng tồi/kích thước phông chữ phụ thuộc người dùng, bản dịch, v.v. Dù sao, các giá trị của wcW và wcH là gì? –

+0

Btw, nếu bạn bỏ qua setFixedSize trên nhãn, nó sẽ hoạt động ít nhất là tốt. –

+0

điều này là do kích thước của hình ảnh được chụp từ webcam có kích thước cố định. Các nhãn là chủ sở hữu cho những hình ảnh chụp –

Trả lời

4

Mã bên dưới hoạt động tốt. Sự cố nằm trong mã bạn không hiển thị. Khi bạn sử dụng QMainWindow, như bạn đã từng thừa nhận để làm, bạn cần đặt centralWidget của mình bằng tiện ích mới mà bạn xây dựng.

// 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

cảm ơn bạn! Tôi đã chạy mã của bạn và nó hoạt động tốt. và tôi cũng biết rằng điều này không giống với trường hợp của QMainWindow, đó là trường hợp của tôi. Tôi thay đổi lớp của tôi thành một lớp con QWidget và nó là OK –

+0

Trong một 'QMainWindow', bạn phải làm việc với' centralWidget() 'của nó. Tôi đã sửa đổi mã cho phù hợp. –

1

WCwindow một lớp con của QMainWindow? Trong trường hợp đó, tôi khuyên bạn nên xóa bố cục khỏi cửa sổ của mình trong trình chỉnh sửa GUI bằng cách nhấp vào nút "ngắt bố cục" trong thanh trên cùng, sau đó sử dụng các mục sau:

//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

cảm ơn bạn! đây là câu trả lời tôi đang tìm kiếm. nó nhấn vấn đề của tôi –

+0

Bạn đang rất hân hạnh! –

+0

Tôi không thể chọn 2 câu trả lời? –

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