【问题标题】:qt paintEvent not triggered when calling the func set setWindowFlags(Qt::FramelessWindowHint); and func winid调用函数集 setWindowFlags(Qt::FramelessWindowHint) 时未触发 qt paintEvent;和 func winid
【发布时间】:2016-11-15 07:26:01
【问题描述】:

谢谢你的帮助~ 因为我需要在某些qlabel的区域使用directx(d3d)播放视频,所以我必须通过调用winid()方法获取标签winId。 但是当我这样做时,出现了一些其他问题~

当我使用 FramelessWindowHint 设置窗口标志时,当我调用 anly winid() 时,自定义按钮的 paintEvent 无法在调用 updata() 后运行:

这样:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    HWND hwnd =  (HWND)(ui->label->winId());// here
    setWindowFlags(Qt::FramelessWindowHint);// and here
    QString playBackPre = "_playBack";
    //do my custom button init; the button will draw an pic when press ?enter or leave
    ui->pushButton->setImages(playBackPre, 1);
    ui->pushButton_2->setImages("_quanJin", 1);
}

请帮帮我,非常感谢!

【问题讨论】:

  • 对不起,我不清楚你在说什么。

标签: qt paintevent


【解决方案1】:

我已经解决了,但我认为这可能是 Qt 中的一个错误。

只是将调用 winid() 函数移出构造。它会闪烁。

【讨论】:

  • 这是设计使然:正在构建的小部件尚不可见,因此没有本机窗口标识符。本机窗口在小部件显示后立即生成:事件循环将QShowEvent 传递给小部件,然后您可以查询winId()
  • 那么,如果我查询winId(),会发生什么?
  • 如果过早查询,会得到无效/空值。您可以通过重新实现 QObject::event 或在小部件上安装事件过滤器来获得对 QEvent::Show 的响应的正确值。
  • 谢谢。但现在,似乎我得到了一个正确的值,可以在构造中查询 winid。唯一的问题是当我调用 setWindowFlags(Qt::FramelessWindowHint) 时,我无法在我的自定义按钮或标签中触发paintEvent。但是如果我在构建后查询winid,问题就不会出现
  • 这是由于实现细节。您可能会过早调用winId 来触发未处理的案例。在QEvent::Show 到达窗口之前调用它,你应该没问题。
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多