2012-09-30 37 views
18

Đây có lẽ là vấn đề ngu ngốc nhất mà tôi từng có, nhưng tôi vô cùng bối rối. Tôi đang cố gắng để bắt đầu với bố trí, nhưng vì một lý do nào đó không thể hình dung ra điều này.Truy cập Bố cục Qt được tạo trong giao diện người dùng từ mã?

Tôi đã thử thêm QGridLayout qua tệp .ui bằng cách kéo thả nó vào dự án của tôi. Vì tôi muốn đưa vào lưới với các widget khi tải, tôi đã cố gắng sử dụng đối tượng "gridLayout" trong tệp "mainwindow.h" cả trước/sau khi this-> setupui() được gọi.

Vì tôi không thể tìm ra điều đó, tôi đã chọn chỉ thử tạo từ đầu bằng mã và sau đó thêm tệp sau vào tệp main.cpp. Điều này không hiển thị, vì vậy tôi tự hỏi làm thế nào trên trái đất tôi có thể cư các lưới khi tải mẫu.

#include <QtGui/QApplication> 
#include <QtGui> 
#include "mainwindow.h" 

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

    QGridLayout *grid = new QGridLayout; 

    QLabel *label1 = new QLabel("test"); 
    QLabel *label2 = new QLabel("test 2"); 

    grid->addWidget(label1, 0, 0); 
    grid->addWidget(label2, 0, 1); 
    w.setLayout(grid); 

    w.show(); 
    return app.exec(); 
} 
+0

gì chính xác là vấn đề, là công cụ mà bạn đang thêm không xuất hiện, hoặc xuất hiện sai địa điểm? – cmannett85

+0

Chúng hoàn toàn không xuất hiện trừ khi tôi thêm chúng thông qua trình chỉnh sửa giao diện người dùng, trong trường hợp này tôi không thể truy cập bố cục thông qua mã để điền vào. –

Trả lời

23

Giả sử, bạn đã chỉ cần đặt một QGridLayout trong QtDesigner để centralWidget của bạn trong MainWindow như thế này:

enter image description here

bạn có thể truy cập vào nó trong mã MainWindow của bạn theo cách đó với đối tượng đúng tên (ở đây nó là gridLayout):

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->gridLayout->addWidget(new QLabel("hello world"),0,0); 
} 

Nếu bạn đã đặt bố trí trong QtDesigner hoặc trong mã và bạn muốn thay đổi cách bố trí, QWidget sẽ không cho phép bạn cài đặt lẫn nhau và bạn sẽ nhận được một thông báo lỗi như thế này:

QWidget :: setLayout: Cố gắng để thiết lập QLayout "" trên MainWindow "MainWindow", mà đã có một bố cục

Trong trường hợp này, bạn phải xóa bố cục hiện tại lúc đầu và sau đó cài đặt bố cục mới như trong mã của bạn ở trên.

Nếu bạn muốn truy cập vào bố trí chức năng chính của bạn, bạn có thể đạt được điều này bởi hàm QObject :: findChild như thế này:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 

    QGridLayout *gridLayout = w.findChild<QGridLayout*>("gridLayout"); 
    Q_ASSERT(gridLayout); 
    gridLayout->addWidget(new QLabel("hello, the second")); 

    w.show(); 
    return a.exec(); 
} 
+0

Ví dụ đầu tiên bạn đưa ra là những gì tôi đã thử đầu tiên, mặc dù tôi không hoàn toàn chắc chắn làm thế nào tôi hơi say lên đó. Tôi tin rằng tôi đã cố gắng truy cập nó như là "gridLayout" như trái ngược với nó là một thành viên của "ui". Cảm ơn rất nhiều vì phản ứng tuyệt vời và thanh toán bù trừ! –

+0

Điều này không hiệu quả đối với tôi (giải pháp đầu tiên.) Biên dịch chương trình nhưng không có widget nào được hiển thị. Bất kỳ ý tưởng gỡ lỗi nào? – baordog

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