Qtのドキュメントには、これら2つの関数は異なる(最初の関数にはフレームが含まれていない)ことが示されていますが、アプリケーションのメインウィンドウを含め、どのウィジェットを選択しても、someWidget->frameGeometry().height()
常にと同じ値が返されsomeWidget->geometry.height()
ます。
ここで何が欠けていますか?
ウィジェットをペイントするのに十分な時間を与えていないと思います。例はほとんどありません:
#include <QApplication>
#include <QMainWindow>
#include <QDebug>
class MainWindow : public QMainWindow
{
public:
MainWindow() {
startTimer(500);
}
void timerEvent(QTimerEvent *e) {
// Here values are different
qDebug() << geometry().height() << frameGeometry().height();
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWin;
mainWin.show();
// Here values are equals
qDebug() << mainWin.geometry().height() << mainWin.frameGeometry().height();
return app.exec();
}
最初のデバッグ出力は と に対して同じ値を生成しますgeometry
がframeGeometry
、2 番目 ( 内timerEvent
) は異なる値を生成します。
QWidget クラスはフレームを持つことができません。たとえば、QWidget にはフレームがありませんが、QFrame にはフレームがあります。
QWidget がトップレベル ウィンドウの場合、その周りに境界線とタイトル バーが表示されます。これをフレームまたは装飾フレームと呼び、frameGeometry() は正確にそれを返します: OS の装飾を含むウィンドウのサイズと位置。反対側の geometry() は、他の子コントロールまたは描画に使用できる QWidget の内側の四角形を返します。http://を参照してください。詳細については、 doc.qt.io /qt-4.8/application-windows.html#window-geometry を参照してください。トップレベルの geometry() / frameGeometry() は、ウィンドウがフレームレスまたはフルスクリーンでない場合に異なります...またはフレームレスについて話している場合x11 の下のウィンドウ マネージャー。