调用move()时Qt QDialog断断续续

Posted

技术标签:

【中文标题】调用move()时Qt QDialog断断续续【英文标题】:Qt QDialog choppy when calling move() 【发布时间】:2011-06-11 17:38:04 【问题描述】:

我正在尝试在 Qt 中创建一个弹出式文本编辑器。我遇到的问题是,由于我使对话框无边界,因此我必须自己调用 move() 函数。这导致了一些我想弄清楚的奇怪行为。我注意到以下情况:

    如果我在没有文本编辑器的情况下制作盒子,那么移动就可以了。只有当我添加编辑器时,它才会变得不稳定。 如果我将其设为普通对话框(而不是在构造函数中使用 Qt::Popup 标志),则无论是否使用编辑器,移动都可以。

这里有一些代码来演示:

#include "textpopup.h"

#include <QPoint>
#include <QMouseEvent>
#include <QPushButton>
#include <QDebug>

TextPopup::TextPopup(QWidget* parent) :
    QDialog(parent, Qt::Popup) // removing Qt::Popup flag gets rid of choppy-ness

    setLayout(&layout);
    layout.addWidget(&textEdit); // removing this gets rid of choppy-ness
    resize(200, 200);
    setFocusPolicy(Qt::StrongFocus);


void TextPopup::mousePressEvent(QMouseEvent* event)

    offset = event->globalPos() - frameGeometry().topLeft();
    previous = event->globalPos();
    QDialog::mousePressEvent(event);


// move whenever user drags widget (does not apply to text editor)
void TextPopup::mouseMoveEvent(QMouseEvent* event)

    qDebug() << "move";
    if(event->buttons() == Qt::LeftButton) 
        move(event->globalPos() - offset);
    

【问题讨论】:

您是否尝试过使用 Qt::Dialog 标志而不是 Qt::Popup 标志?您使用Qt::Popup 标志的目的是什么? 我不希望使用 Qt::Dialog 标志的标题栏。 【参考方案1】:

如果有人感兴趣,我找到了一个解决方案——它至少有效。我没有使用 Qt::Popup 标志,而是使用了 Qt::SplashScreen 标志,它也没有标题栏并且没有表现出不稳定的行为。

【讨论】:

以上是关于调用move()时Qt QDialog断断续续的主要内容,如果未能解决你的问题,请参考以下文章

Qt编程中QDiaog的ESC建

QT Qdialog

Qt自定义窗口,继承自QDialog,执行后返回rejected的问题分析

Qt编程求助:有没有啥类似QDialog::exec()之类的能阻塞程序的方法?

带有隐藏和 WA_QuitOnClose 的 Qt QDialog

qt5:如何从 qthread 中的静态函数创建和显示自定义 qdialog