2012-05-28 41 views
7

Tôi đang cố tạo bố cục trong lớp MainWindow của mình theo cách động. Tôi có bốn khung được đặt với một đối tượng bố trí lưới. Mỗi khung chứa một ClockWidget tùy chỉnh. Tôi muốn các đối tượng ClockWidget thay đổi kích thước cho phù hợp khi tôi thay đổi kích thước cửa sổ chính, vì vậy tôi cần thêm chúng vào bố cục. Tuy nhiên, tôi cần phải làm điều này trong thời gian chạy, vì chính đối tượng đó được tạo ra khi chạy. Tôi đã cố gắng thực hiện điều này theo chương trình, nhưng mã nhận xét bên dưới cố gắng tạo bố cục mới khiến chương trình bị lỗi. Thủ tục để thực hiện điều này là chính xác?Qt Tạo bố cục và thêm tiện ích vào bố cục động

header file:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

#include "ClockView.h" 

namespace Ui{ 
    class MainWindow; 
} 

class QLayout; 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 

    explicit MainWindow(QWidget *parent = 0); 

    ~MainWindow(); 

    void populateViewGrid(); 

private: 

    Ui::MainWindow *ui; 

    ClockView *clockView_1; 
    ClockView *clockView_2; 
    ClockView *clockView_3; 
    ClockView *clockView_4; 

    QLayout *layout_1; 
    QLayout *layout_2; 
    QLayout *layout_3; 
    QLayout *layout_4; 
}; 

#endif // MAINWINDOW_H 

thực hiện file:

#include <QVBoxLayout> 

#include "MainWindow.h" 
#include "ui_MainWindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    populateViewGrid(); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::populateViewGrid() 
{ 
    clockView_1 = new ClockView(ui->frame_1); 
    clockView_2 = new ClockView(ui->frame_2); 
    clockView_3 = new ClockView(ui->frame_3); 
    clockView_4 = new ClockView(ui->frame_4); 

    /* 
    layout_1 = new QVBoxLayout; 
    layout_2 = new QVBoxLayout; 
    layout_3 = new QVBoxLayout; 
    layout_4 = new QVBoxLayout; 

    layout1->addWidget(clockView_1); 
    layout2->addWidget(clockView_2); 
    layout3->addWidget(clockView_3); 
    layout4->addWidget(clockView_4); 

    ui->frame_1->setLayout(layout_1); 
    ui->frame_2->setLayout(layout_2); 
    ui->frame_3->setLayout(layout_3); 
    ui->frame_3->setLayout(layout_4); 
    */ 
} 
+0

Có thông tin hữu ích nào trong sự cố không? Bạn đã thử thiết lập cha mẹ của mỗi bố trí trong init: 'new QVBoxLayout (frame_1)', thay vì 'setLayout()' cuộc gọi? – jdi

Trả lời

6

thủ tục của bạn là đúng. Ví dụ: có một số lỗi chính tả, bạn đang đặt bố cục hai lần cho frame3. Đó có thể là vấn đề của bạn. Sự cố không phải lúc nào cũng có thể tái sản xuất. Tôi không nghĩ rằng bạn có bất kỳ vấn đề khác hơn thế. Dưới đây là một ví dụ tự chứa. Nó cũng giữ tất cả các trường hợp theo giá trị, tránh sự bi quan sớm của một dereference thêm thông qua một con trỏ.

// https://github.com/KubaO/stackoverflown/tree/master/questions/dynamic-widget-10790454 
#include <cmath> 
#include <QtGui> 
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) 
#include <QtWidgets> 
#endif 
#include <array> 

// Interface 

class ClockView : public QLabel 
{ 
public: 
    explicit ClockView(QWidget* parent = nullptr) : QLabel(parent) 
    { 
     static int ctr = 0; 
     setText(QString::number(ctr++)); 
    } 
}; 

class MainWindow : public QMainWindow 
{ 
public: 
    explicit MainWindow(QWidget *parent = nullptr); 
    void populateViewGrid(); 

private: 
    static constexpr int N = 10; 

    QWidget central{this}; 
    QGridLayout centralLayout{&central}; 
    std::array<QFrame, N> frames; 

    std::array<ClockView, N> clockViews; 
    std::array<QVBoxLayout, N> layouts; 
}; 

// Implementation 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    setCentralWidget(&central); 

    const int n = ceil(sqrt(N)); 
    for (int i = 0; i < N; ++ i) { 
     frames[i].setFrameShape(QFrame::StyledPanel); 
     centralLayout.addWidget(&frames[i], i/n, i%n, 1, 1); 
    } 

    populateViewGrid(); 
} 

void MainWindow::populateViewGrid() 
{ 
    for (int i = 0; i < N; ++ i) { 
     layouts[i].addWidget(&clockViews[i]); 
     frames[i].setLayout(&layouts[i]); 
    } 
} 

int main(int argc, char** argv) 
{ 
    QApplication app{argc, argv}; 
    MainWindow w; 
    w.show(); 
    return app.exec(); 
} 

Và tệp dự án qmake.

greaterThan(QT_MAJOR_VERSION, 4) { 
    QT = widgets 
    CONFIG += c++11 
} else { 
    QT = gui 
    unix:QMAKE_CXXFLAGS += -std=c++11 
    macx { 
     QMAKE_CXXFLAGS += -stdlib=libc++ 
     QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7 
    } 
} 
TARGET = dynamic-widget-10790454 
TEMPLATE = app 
SOURCES += main.cpp 
+0

Lỗi đánh máy rất có thể là vấn đề. Tôi đã thử biên dịch lại và bây giờ nó hoạt động như mong muốn. – dtg

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