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定時器
- DNS設定引起的登入延遲DNS
- 分析伺服器延遲的問題伺服器
- setTimeout()設定延遲時間為0毫秒的作用
- 美國伺服器延遲高怎麼辦,如何解決延遲問題伺服器
- 實時重新整理快取-處理mysql主從延遲的一些設計方案快取MySql
- 疫情延遲 題解
- MySQL之 從複製延遲問題排查MySql
- 伺服器延遲問題如何解決伺服器
- win10 鍵盤延遲怎麼設定_win10鍵盤延遲設定在哪裡Win10
- mysql的主從複製資料延遲問題MySql
- 關於延遲載入,立即載入的問題
- Django的時區設定問題Django
- Google 怎麼解決長尾延遲問題Go
- 怎麼解決伺服器延遲問題伺服器
- 『開源』大半夜除錯TCP延遲問題除錯TCP
- ALV LAYOUT的設定
- go-zero 如何應對海量定時/延遲任務?Go
- Bash: sleep - 延遲指定時間
- Android非同步、延遲和定時任務的簡易用法Android非同步
- Windows10系統怎麼設定延遲更新Windows
- Fiddler(8)設定網路丟包和延遲
- 《RabbitMQ》| 解決訊息延遲和堆積問題MQ
- Go GC:Go 1.5 將會解決延遲問題GoGC
- oracle 11g 密碼延遲驗證問題Oracle密碼
- 一次 RocketMQ 順序消費延遲的問題定位MQ
- 教你如何解決MySQL資料延遲跳動的問題MySql
- 巧用閃回查詢來分析事務延遲的問題
- 如何避免MYSQL主從延遲帶來的讀寫問題?MySql
- MySQL5.6升級5.7時,出現主從延遲問題排查過程MySql
- Win10系統設定觸控板延遲功能的方法Win10
- 延時 (遲) 操作的 PHP 簡單實現PHP
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- 新 Uber 司機端是如何克服網路延遲問題
- mysql同步問題之Slave延遲很大最佳化方法MySql
- Bittrex交易平臺遭遇提現嚴重延遲問題
- MongoDB從庫延遲讀取資料問題的解決思路MongoDB