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