Qt动态创建布局并向布局添加小部件
Qt Creating layouts and adding widgets to layouts dynamically
我正在尝试在我的 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
实现文件:
#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);
*/
}
您的程序是正确的。有一些拼写错误,例如,您为frame3
设置了两次布局。那可能是你的问题。崩溃并不总是可重现的。我认为除此之外你没有任何其他问题。下面是一个自包含的示例。它还按值保留所有实例,避免通过指针过早悲观额外的取消引用。
// 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{¢ral};
std::array<QFrame, N> frames;
std::array<ClockView, N> clockViews;
std::array<QVBoxLayout, N> layouts;
};
// Implementation
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setCentralWidget(¢ral);
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();
}
和 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
相关文章:
- 如何在qt中将对象添加到现有布局中?--已解决
- 将小部件添加到布局后,QStylesheet 不起作用
- 将布局从一个类添加到另一类不起作用
- 如何将项目添加到QT中的布局中
- 如果有可用的位置,如何在布局中添加小部件?否则不添加
- 如何将添加的小部件定位到基于同一布局中的另一个小部件的布局中
- 动态地将自定义 qt 小部件添加到框架中,而无需每次都更改布局
- 如何在Qt中将滚动条添加到网格布局
- 将类布局添加到另一个类布局:"The program has unexpectedly finished."
- Qt动态创建布局并向布局添加小部件
- Qt在主布局中添加布局
- 将组件添加到qt创建者从代码中创建的布局中
- 将自定义小部件动态添加到烘焙布局中
- cocos2d- x3将精灵添加到布局中
- Qt小部件布局添加事件
- 如何在QMainWindow布局中添加小部件
- 在QT c++中为包含布局的小部件添加滚动条
- QGLWidget添加到布局时崩溃
- 清理Qt布局并添加其他小部件不起作用.幽灵小部件留下来.Qt错误
- 在QMain窗口上添加QT布局的代码