Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QWidget::geometry()与QWidget::frameGeometry()的比较_Qt_Qt4 - Fatal编程技术网

Qt QWidget::geometry()与QWidget::frameGeometry()的比较

Qt QWidget::geometry()与QWidget::frameGeometry()的比较,qt,qt4,Qt,Qt4,尽管指示这两个函数不同(第一个不包括框架),但无论我选择什么小部件(包括我的应用程序的主窗口),someWidget->frameGeometry().height()始终返回与someWidget->geometry.height()相同的值 我这里缺少什么?QWidget类不能有框架。例如,QWidget没有框架,但QFrame有框架。我认为,您没有足够的时间来绘制小部件。没有什么例子: #include <QApplication> #include <QMainWind

尽管指示这两个函数不同(第一个不包括框架),但无论我选择什么小部件(包括我的应用程序的主窗口),
someWidget->frameGeometry().height()
始终返回与
someWidget->geometry.height()相同的值


我这里缺少什么?

QWidget类不能有框架。例如,QWidget没有框架,但QFrame有框架。

我认为,您没有足够的时间来绘制小部件。没有什么例子:

#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();
}
#包括
#包括
#包括
类主窗口:公共QMainWindow
{
公众:
主窗口(){
startTimer(500);
}
无效timerEvent(QTimerEvent*e){
//这里的值是不同的

qDebug()如果QWidget是顶级窗口,那么您可以看到它周围的边框和标题栏。我们称之为框架或装饰框架,框架几何体()精确返回:窗口大小和位置,其中包括操作系统装饰。另一侧的几何体()returs QWidget Internal rect,可用于其他子控件或绘制。有关详细信息,请参阅。Toplevel geometry()/frameGeometry()如果我们的窗口不是无框或全屏的,或者我们正在讨论x11下的无框窗口管理器,则会有所不同。

这是一篇老文章,但这可能会帮助那些搜索相同问题的人

就打电话

adjustSize(); 
在提示用户输入某些几何体属性之前,
frameGeometry()
可能在窗口创建生命周期的早期不包括框架边距。我发现以下代码在调用
frameGeometry()
不起作用的某些情况下有效

QMargins frameMargins;
QWindow *window = widget->windowHandle();
if (window) {
    window->create();
    frameMargins = window->frameMargins();
}

QRect myFrameGeometry = widget->geometry().adjusted( 
        -frameMargins.left(), -frameMargins.top(),
        frameMargins.right(), frameMargins.bottom());

谢谢你的说明——非常有用。@Planarian,但我不知道完全绘制需要多长时间:(但不是很多QWidget都有吗?例如,QmduseBwindow不继承QFrame