Qt在resizeEvent中添加子小部件
Qt adding child widget in resizeEvent
我有一个小部件W
从布局设置为QVBoxLayout
实例的QFrame
派生。我想知道以下resizeEvent
实现是否正确,还是会导致无限循环:
void W::resizeEvent(QResizeEvent *event) {
for (/* some condition based on the new size of this widget */) {
// Infinite loop or not?
qobject_cast<QVBoxLayout *>(layout())->addWidget(new QWidget());
}
}
到目前为止,它对我有用,这纯粹是运气吗?
没关系。 W
拥有一家拥有QWidget
QLayout
。将QWidget
添加到QLayout
不会更改W
的大小。你总是看到这一点。例如,如果将子构件放置在父构件中,并且父构件太小,则子构件将被裁剪。不同的是,父母的大小不会拉伸以适应孩子的大小。我相信您的代码将根据父级的大小(例如,当窗口大小更改时(隐藏或显示小部件的典型方式。
绘制和构建小部件的层次结构是两回事。因此,添加 QWidget
s 很好,但直接在 resizeEvent
中使用 QPainter
则不行。
QWidget
的层次结构
QWidget
衍生物(QLineEdit
、QPushButton
、...(的层次结构是图形用户界面应该是什么样子的高级规范,可以使用QLayout
项进行排序。
画
绘画(使用QPainter
(是在屏幕上实际绘制某些内容的过程,并且纯粹是在虚拟功能QWidget::paintEvent
中完成的。QWidget
的每个导数都应该提供这个空基函数的实现。默认派生物(QLineEdit
,...(根据其当前状态(小部件的大小,QLineEdit
的当前文本...(和当前QStyle
对象提供paintEvent
的实现,该对象通常根据您的操作系统自动设置,但可以使用QWidget::setStyle
或QApplication::setStyle
以编程方式进行更改。可以使用 QWidget::update
请求重新绘制。
不应该/不需要"与"可能不需要">
句子">不需要(或应该(在此处理程序中完成任何绘图">是为实现自定义QWidget
(使用paintEvent
的新实现(的人准备的,以明确您不应该在这里实现您的绘画,但将自动触发paintEvent
。
不应该/不需要"是一些建议,他们不写"可能不"。因此,如果您出于某种原因(例如实时应用程序(想要立即刷新屏幕,您可以使用重绘立即调用重绘,从而导致在resizeEvent
期间调用paintEvent
。只要QWidget
上的所有QPainter
操作都在paintEvent
内(按照 QPainter 文档中的警告的要求(,一切都很好。
在resizeEvent
函数中使用addWidget
将小部件添加到布局不是问题,因为它不会立即触发绘图。
您可以通过编译和执行这个简单的项目来轻松验证这一点:
对话框.h:
#pragma once
#include <QDialog>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
void resizeEvent(QResizeEvent *event);
void paintEvent(QPaintEvent *event);
private:
bool resizing;
};
对话框.cpp:
#include "dialog.h"
#include <QResizeEvent>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDebug>
Dialog::Dialog(QWidget *parent)
: QDialog(parent),
resizing(false)
{
new QVBoxLayout(this);
}
Dialog::~Dialog()
{
}
void Dialog::resizeEvent(QResizeEvent *event)
{
resizing = true;
if ( event->size().width() == event->size().height() )
{
qDebug() << "Adding widget";
// Infinite loop or not?
layout()->addWidget(new QPushButton());
}
resizing = false;
}
void Dialog::paintEvent(QPaintEvent *event)
{
if ( resizing )
{
qDebug() << "Painting while resizing widget";
}
}
主.cpp:
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
当您运行程序时,调整对话框的大小使其为正方形(宽度==高度(,插入一些按钮("添加小部件"打印到控制台(,但您永远不会看到"在调整小部件大小时绘画"消息。这很可能是因为addWidget
设置了一个脏显示标志,稍后由框架处理。它会使显示器失效,但不会立即重新粉刷。
所以你正在做的很好,不违反框架要求("不需要(或应该(在这个处理程序中完成任何绘图。
但是,如果您没有信心(也许该绘画可以立即在不同的操作系统上操作,或者在未来的Qt版本中操作......你不能确定(,你也可以通过使用Qt::QueuedConnection
发出连接到插槽的信号来延迟插入,这个插槽将在"稍后"执行,然后调用addWidget
,保证它是在resizeEvent
功能之外完成的。
- Qt:无法直接为带有子项的小部件添加滚动条
- 在QT中为小部件添加彩色边框的最佳方法是什么
- 将小部件添加到布局后,QStylesheet 不起作用
- C++ Qt如何在滚动区域添加小部件?
- 如何从一个向量中删除最小元素并添加到另一个向量,而第一个变为空?
- 将STL文件添加到QT小部件
- 如何使用Qt中的代码将小部件添加到中央小部件中
- 如何将开关QML添加到QT小部件
- 递归地将 1 添加到 BST 中的所有节点,但具有最小数据的节点除外
- 向 Q 小部件添加滚动条
- 如何将小部件添加到qt工具栏
- C++ 创建小部件数组
- 动态地将自定义 qt 小部件添加到框架中,而无需每次都更改布局
- Qt - 无效使用不完整的类型 'class QScrollBar' - 为文本编辑小部件添加水平滚动条
- 在Qt中向小部件添加滚动条的最快和最佳方法
- 如何将自定义小部件添加为工具按钮的弹出菜单
- 将自定义小部件添加为 QTableWidget HorizontalHeader
- Gtk Notebook小部件添加新选项卡错误
- 在QT c++中为包含布局的小部件添加滚动条
- 向小部件添加标签