[英]Qt, offset when restore geometry
使用Qt 5.11,我有以下代碼可以保存QDialog子類的最終還原幾何:
class HlgRunoffEditorDialog:public QDialog
{
some code
}
void HlgRunoffEditorDialog::show()
{
if (isVisible())
return;
ReosSettings settings;
restoreGeometry(settings.value(QStringLiteral("RunoffEditorDialog/geometry")).toByteArray());
ui->splitter->restoreState(settings.value(QStringLiteral("RunoffEditorDialog/splitter/geometry")).toByteArray());
QDialog::show();
}
void HlgRunoffEditorDialog::closeEvent(QCloseEvent *event)
{
updateSettings();
QDialog::closeEvent(event);
}
void HlgRunoffEditorDialog::updateSettings()
{
ReosSettings settings;
settings.setValue(QStringLiteral("RunoffEditorDialog/geometry"),saveGeometry());
settings.setValue(QStringLiteral("RunoffEditorDialog/splitter/geometry"),ui->splitter->saveState());
}
問題是當調用show()方法時,窗口與close事件之前的位置有一個偏移量。 圖片比文字更明確:
紅線是關閉事件之前的位置。
似乎新位置是在窗口小部件的左上角(包括調用show()方法id之后的窗口框架)上設置關閉事件之前,已設置窗口小部件的左上角點(不包括窗口框架)。
任何想法 ?
編輯1
上面的偏移量是在Windows上。 當我在Linux KDE上運行時,偏移似乎在另一個方向上....
編輯2:
當QDialog關閉且十字在右上角時,此偏移量會出現。 當使用關閉按鈕(連接到close()插槽)關閉QDialog時,偏移不在此處...
為了正確地重置小部件(如Windows)的可見性狀態,您必須遵循以下調用順序:
// 1) show the widget
widget->show();
// 2) set status bar visibility (if exists)
//widget->statusBar->setVisible(booleanValueFromSettings);
// 3) set margins (if use it)
//widget->setContentsMargins(a, b, c, d);
// 4) geometry
widget->restoreGeometry(byteArrayFromSettings);
// 5) state (can be use it and for you splitter)
widget->restoreState(byteArrayFromSettings);
我記得一個項目,我必須計算一下,像這樣:
QRect ng = w->normalGeometry();
QRect frame = w->frameGeometry();
ng.adjust(-frame.x(), -frame.y(), -frame.x(), -frame.y());
並保存后面的值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.