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