Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt动态创建布局并向布局添加小部件_C++_User Interface_Layout_Qt4 - Fatal编程技术网

C++ Qt动态创建布局并向布局添加小部件

C++ Qt动态创建布局并向布局添加小部件,c++,user-interface,layout,qt4,C++,User Interface,Layout,Qt4,我试图在我的MainWindow类中动态创建布局。我有四个框架,它们与网格布局对象一起放置。每个帧都包含一个自定义时钟小部件。当我调整主窗口的大小时,我希望ClockWidget对象相应地调整大小,因此我需要将它们添加到布局中。但是,我需要在运行时执行此操作,因为对象本身是在运行时创建的。我试图通过编程实现这一点,但是下面注释掉的代码试图创建一个新的布局,导致程序崩溃。正确执行此操作的步骤是什么 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H #i

我试图在我的MainWindow类中动态创建布局。我有四个框架,它们与网格布局对象一起放置。每个帧都包含一个自定义时钟小部件。当我调整主窗口的大小时,我希望ClockWidget对象相应地调整大小,因此我需要将它们添加到布局中。但是,我需要在运行时执行此操作,因为对象本身是在运行时创建的。我试图通过编程实现这一点,但是下面注释掉的代码试图创建一个新的布局,导致程序崩溃。正确执行此操作的步骤是什么

头文件:

#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
\ifndef主窗口
#定义主窗口
#包括
#包括“ClockView.h”
名称空间用户界面{
类主窗口;
}
QLayout类;
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
void populateViewGrid();
私人:
Ui::MainWindow*Ui;
时钟视图*时钟视图_1;
时钟视图*时钟视图2;
时钟视图*时钟视图_3;
时钟视图*时钟视图4;
QLayout*布局图1;
QLayout*布局图2;
QLayout*布局图3;
QLayout*布局图4;
};
#endif//main窗口
实施文件:

#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);
    */
}
#包括
#包括“MainWindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
populateViewGrid();
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void MainWindow::populateViewGrid()
{
clockView_1=新的clockView(用户界面->帧_1);
clockView_2=新的clockView(用户界面->帧_2);
clockView_3=新的clockView(用户界面->帧_3);
clockView_4=新的clockView(用户界面->帧_4);
/*
布局_1=新的QVBoxLayout;
layout_2=新的QVBoxLayout;
布局_3=新的QVBoxLayout;
布局_4=新的QVBoxLayout;
布局1->addWidget(时钟视图1);
布局2->addWidget(时钟视图2);
布局3->addWidget(时钟视图3);
布局4->addWidget(时钟视图4);
ui->frame_1->setLayout(布局_1);
ui->frame_2->setLayout(布局_2);
ui->frame_3->setLayout(布局_3);
ui->frame_3->setLayout(布局_4);
*/
}

您的程序是正确的。有一些输入错误,例如,您为
frame3
设置了两次布局。那可能是你的问题。崩溃并不总是可以重现的。我想你没有其他问题了。下面是一个独立的示例。它还按值保留所有实例,避免过早地悲观化通过指针的额外解引用

//https://github.com/KubaO/stackoverflown/tree/master/questions/dynamic-widget-10790454
#包括
#包括
#如果QT\u版本>=QT\u版本检查(5,0,0)
#包括
#恩迪夫
#包括
//接口
类ClockView:publicqlabel
{
公众:
显式时钟视图(QWidget*parent=nullptr):QLabel(parent)
{
静态int ctr=0;
setText(QString::number(ctr++);
}
};
类主窗口:公共QMainWindow
{
公众:
显式主窗口(QWidget*parent=nullptr);
void populateViewGrid();
私人:
静态constexpr int N=10;
QWidget central{this};
QGridLayout centralLayout{¢ral};
std::数组帧;
阵列时钟视图;
阵列布局;
};
//实施
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父窗口)
{
setCentralWidget(¢ral);
const int n=ceil(sqrt(n));
对于(int i=0;i
以及qmake项目文件。


坠机事件中有什么有用的信息吗?您是否尝试过在初始化期间设置每个布局的父级:
newqvboxlayout(frame_1)
,而不是
setLayout()
调用?输入错误很可能是问题所在。我尝试重新编译,现在它的行为符合要求。
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