【问题标题】:How to make showEvent() get called?如何让 showEvent() 被调用?
【发布时间】:2017-01-06 12:04:54
【问题描述】:

为了在QWidget 派生类中调用showEvent(),我需要什么?

ConfigMenuForm.h

//simplified the code of the class declaration
class ConfigMenuForm : public QWidget
{
    Q_OBJECT

public:
    explicit ConfigMenuForm(QWidget *parent = 0);
    ~ConfigMenuForm();

signals:

public slots:

private slots:

protected:
    void showEvent(QShowEvent *event) override; //with or without the override keyword, no change
private:
}

ConfigMenuForm.cpp

//amongst others
void ConfigMenuForm::showEvent(QShowEvent * event)
{
    //do some stuff here - really simple
}

当我show() 我的小部件时,我无法触发它... 我的意思是代码没有效果,并且在放置断点时,它不会停止,所以我假设事件没有被触发。

我做错了什么?

编辑 - 添加更多代码和精度:

我正在使用 QtCreator 3.0.0 和 Qt 5.2.0(MSVC 2010,32 位)

//creating the widget in the main window's constructor (class Viewer)
// ConfigMenuForm calls hide() in its own constructor
 m_configMenuForm = new ConfigMenuForm(this);

然后当我按下主窗口上的按钮时

void Viewer::ontBConfigClicked()
{
    m_configMenuForm->show();
}

让我感到困惑的是m_configMenuForm 实际上显示在主窗口的顶部,它变得可见并且正常工作!只是没有调用showEvent。

【问题讨论】:

  • 你怎么称呼这个小部件的show
  • 为了让showEvent 被调用,您只需要按照您所说所做的操作。这是minimal example。如果您通过放置断点进行测试,则可能您尚未将调试器附加到您的应用程序。如果您使用的是 Qt Creator,则需要使用“开始调试”按钮 F5(而不是“运行”按钮 ctrl + R)。
  • @Jonathan Mee:直接从拥有此小部件的另一个小部件调用 show() 插槽
  • @Mike:是的,谢谢你的提示,现在使用 QtCreator 几个月了@工作,这正是我一直在做的事情。看到这种奇怪的行为,我以为我错过了由于我现在的反应而看不到的东西^^我会看看这个例子。对我来说真的很奇怪,我可以调试主窗口的 closeEvent 但 showEvent 仍然不起作用。难道是因为一些eventFilter?
  • 我的项目似乎有问题或类似的问题,因为我刚刚在一个小的新项目中测试了这个想法,它的工作就像一个魅力。当我发现问题所在时,我会发布解决方案。感谢您的耐心等待。

标签: c++ qt qwidget


【解决方案1】:

我正在回答我自己的问题,因为最终这不是编程问题。 编译/调试的东西一定有问题。

作为记录,如果您的代码中的一切都正确,但由于某些奇怪的原因没有调用函数(也许它只能在 Qt 的事件处理程序重新实现时发生?)。

这发生在使用 QtCreator 3.0.0 和 Qt 5.2.0 MSVC2010 - 32 位

  1. 清理项目:菜单Build->Clean All
  2. 关闭 QtCreator
  3. 转到您的构建项目/调试文件夹并删除 .exe、.pdb 和 .ilk 文件
  4. 转到您的 build-project/cache 文件夹并删除与您的项目同名的以 .pdb 为后缀的文件夹(yourproject.pdb 文件夹) - 不确定这是否有必要,但我这样做了也写在这里

  5. 重新启动 QtCreator、qmake、构建和运行/调试(以及 tadaaa!)

“简单”的清理一切都没有奏效,甚至没有重新启动计算机。我不得不手动删除 QtCreator 没有删除的文件。

我希望它可以帮助将来的人,节省几个小时。

【讨论】:

    【解决方案2】:

    要在 Visual Studio 中设置断点,请参考:breakpoint

    showEvent() 在您恢复窗口时调用以获取更多信息showEvent

    代码片段:-

    #include <QtGui>
    #include <iostream>
    
    //Move this class to any header file then exceute
    class widget : public QWidget
    {
        Q_OBJECT
    protected :
        void showEvent( QShowEvent * event )
        {
            QWidget::showEvent(event);
        }
    };
    
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        widget w;
        w.show(); //Here showEvent() get called
        return app.exec();
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-28
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多