QWidget設定layout時的延遲重新整理問題
QWidget設定layout時的延遲重新整理問題
問題說明
我在給一個QWidget A設定layout後立刻呼叫layout內QWidget B的函式,此時並沒有重新整理A的geometry,程式碼如下:
void test()
{
m_bWidget = new BWidget();
m_layout = new QHBoxLayout();
m_layout->addWidget(m_bWidget);
//設定layout
m_aWidget->setLayout(m_layout);
//呼叫內部QWidget物件的函式
m_bWidget->resize();
}
void BWidget::resize()
{
//此時輸出的geometry並不是最新m_aWidget的geometry,而是之前該layout的geometry或0.
qDebug()<<"this geometry top left: x = "<<this->geometry().topLeft().x()<<"y = "<<this->geometry().topLeft().y();
qDebug()<<"this geometry bottom right: x = "<<this->geometry().bottomRight().x()<<"y = "<<this->geometry().bottomRight().y();
}
解決方法
在setlayout之後設定一個延時呼叫,setlayout內部執行該動作需要一定時間,所以解決辦法是寫一個槽函式延時呼叫resize(),程式碼如下:
void test()
{
m_bWidget = new BWidget();
m_layout = new QHBoxLayout();
m_layout->addWidget(m_bWidget);
//設定layout
m_aWidget->setLayout(m_layout);
//寫一個槽延時函式,這裡博主有測試500ms 50ms 10ms 0ms均無問題故最後取0,因為也是需要儘快重新整理。
QTimer::singleShot(0, this, SLOT(slot_resizeBWidget()));
}
void slot_resizeBWidget()
{
m_bWidget->resize();
}
導致原因
推測是由下邊這段函式中有什麼延時重新整理geometry導致的,有興趣可以查一下這段qt的原始碼。
/*!
\fn void QWidget::setLayout(QLayout *layout)
Sets the layout manager for this widget to \a layout.
If there already is a layout manager installed on this widget,
QWidget won't let you install another. You must first delete the
existing layout manager (returned by layout()) before you can
call setLayout() with the new layout.
If \a layout is the layout manger on a different widget, setLayout()
will reparent the layout and make it the layout manager for this widget.
Example:
\snippet examples/uitools/textfinder/textfinder.cpp 3b
An alternative to calling this function is to pass this widget to
the layout's constructor.
The QWidget will take ownership of \a layout.
\sa layout(), {Layout Management}
*/
void QWidget::setLayout(QLayout *l)
{
if (!l) {
qWarning("QWidget::setLayout: Cannot set layout to 0");
return;
}
if (layout()) {
if (layout() != l)
qWarning("QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", which already has a"
" layout", l->objectName().toLocal8Bit().data(), metaObject()->className(),
objectName().toLocal8Bit().data());
return;
}
QObject *oldParent = l->parent();
if (oldParent && oldParent != this) {
if (oldParent->isWidgetType()) {
// Steal the layout off a widget parent. Takes effect when
// morphing laid-out container widgets in Designer.
QWidget *oldParentWidget = static_cast<QWidget *>(oldParent);
oldParentWidget->takeLayout();
} else {
qWarning("QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", when the QLayout already has a parent",
l->objectName().toLocal8Bit().data(), metaObject()->className(),
objectName().toLocal8Bit().data());
return;
}
}
Q_D(QWidget);
l->d_func()->topLevel = true;
d->layout = l;
if (oldParent != this) {
l->setParent(this);
l->d_func()->reparentChildWidgets(this);
l->invalidate();
}
if (isWindow() && d->maybeTopData())
d->topData()->sizeAdjusted = false;
}
相關文章
- 定時器(setTimeout/setInterval)最小延遲的問題定時器
- JMeter定時器設定延遲與同步JMeter定時器
- 分析伺服器延遲的問題伺服器
- 美國伺服器延遲高怎麼辦,如何解決延遲問題伺服器
- 實時重新整理快取-處理mysql主從延遲的一些設計方案快取MySql
- MySQL之 從複製延遲問題排查MySql
- [20190218]延遲約束問題2.txt
- 伺服器延遲問題如何解決伺服器
- 第78篇 Redis常見延遲問題Redis
- win10 鍵盤延遲怎麼設定_win10鍵盤延遲設定在哪裡Win10
- 疫情延遲 題解
- Django的時區設定問題Django
- Fiddler(8)設定網路丟包和延遲
- Android非同步、延遲和定時任務的簡易用法Android非同步
- 『開源』大半夜除錯TCP延遲問題除錯TCP
- 怎麼解決伺服器延遲問題伺服器
- Google 怎麼解決長尾延遲問題Go
- 【每日一題】743. 網路延遲時間每日一題
- go-zero 如何應對海量定時/延遲任務?Go
- 如何避免MYSQL主從延遲帶來的讀寫問題?MySql
- 教你如何解決MySQL資料延遲跳動的問題MySql
- 一次 RocketMQ 順序消費延遲的問題定位MQ
- 《RabbitMQ》| 解決訊息延遲和堆積問題MQ
- MySQL5.6升級5.7時,出現主從延遲問題排查過程MySql
- [20190124]bbed恢復資料遇到延遲塊清除的問題.txt
- 由於網路延遲造成邏輯鎖過期的問題
- mysql同步問題之Slave延遲很大最佳化方法MySql
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- 延時 (遲) 操作的 PHP 簡單實現PHP
- 打破延遲,實時同步不再難!
- goldengate抽取程式延遲90小時Go
- 從時延毛刺問題定位到 Netty 的效能統計設計Netty
- 這套方法論,徹底終結MySQL同步延遲問題MySql
- 新 Uber 司機端是如何克服網路延遲問題
- tabelview重新整理不能及時問題View
- 如何利用網路延遲穿越時空
- Node.js結合RabbitMQ延遲佇列實現定時任務Node.jsMQ佇列
- [20190125]bbed恢復資料遇到延遲塊清除的問題3.txt