gpt4 book ai didi

c++ - 有什么办法可以暂时停止布局重新计算?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:11 26 4
gpt4 key购买 nike

我正在实现一个拖放事件过滤器来重新排列布局中的小部件,并在某一时刻将其中的几个弹出到一个队列中,在被拖动的小部件所在的位置添加一个橡皮筋,然后添加其余的小部件回到布局(因为似乎没有办法使用 QLayout 界面“插入”),如下所示:

// HANDLE DRAG ENTER EVENTS
if (p_event->type() == QEvent::DragEnter)
{
QDragEnterEvent* dragEnterEvent = static_cast<QDragEnterEvent*>(p_event);
if (dragEnterEvent->mimeData()->hasFormat("text/plain"))
{
QString objectName = dragEnterEvent->mimeData()->text();

// findChild doesn't work on layouts because they don't ever
// inject themselves into the parent/child hierarchy, so we
// use the itemAt approach instead.
for (int i = 0; i < layout->count(); ++i)
{
dragItem = layout->itemAt(i)->widget();
if (dragItem->objectName() == objectName)
{
dragEnterEvent->acceptProposedAction();

// 'Rearrange' the widgets. This basically entails removing
// everything after the drag item, adding a placeh older, and
// then adding them back
QQueue<QWidget*> fifo;

// take everything after the drag item out
// important to have count as a local var, because otherwise it will
// decrement with every loop iteration.
int count = layout->count();
for (int j = i + 1; j < count; j++)
{
fifo.enqueue(layout->takeAt(i+1)->widget()); // the indices shift left on their own, so we only ever want to take i+1.
}

// add a 'rubber band' placeholder
m_band = new QRubberBand(QRubberBand::Rectangle);
m_band->setObjectName("placeholderBand");
m_band->setVisible(true);
m_band->setFixedSize(dragItem->size());
layout->addWidget(m_band);

// put the widgets in the fifo back in
count = fifo.count();
for(int j = 0; j < count; j++)
{
layout->addWidget(fifo.dequeue());
}

break;
}
}
}
}

这种方法的问题是添加/删除小部件会导致非常明显和讨厌的闪烁。有没有

  1. 我可以通过某种方式阻止布局重新计算自身,直到完成所有添加/删除操作,或者
  2. 有什么更好的方法可以将小部件插入到布局中(仅使用 QLayout 接口(interface))而不会导致闪烁?

最佳答案

不确定它是否有帮助,因为我在不同的上下文中使用过(语义语法突出显示,在我的项目中 loqt)。

#ifndef BLOCKSIG_H
#define BLOCKSIG_H

#include <QObject>
#include <QPointer>

/** temporary stop signals communication
* use with care: notably QTextEdit formatting can be lost
* on multiple changes notification
*/
struct blockSig {

blockSig(QObject* target) : target(target) { current = target->blockSignals(true); }
~blockSig() { off(); }

void off() { if (target) { target->blockSignals(current); target = 0; } }

private:

QPointer<QObject> target;
bool current;
};

#endif

示例用法,避免在格式更改时收到不需要的通知

#include "blockSig.h"

void ConsoleEdit::selectionChanged()
{
blockSig bs(this);

foreach (ExtraSelection s, extraSelections())
s.cursor.setCharFormat(s.format);
extraSelections().clear();

...
}

关于c++ - 有什么办法可以暂时停止布局重新计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com