2017-01-06 5 views
1

Что нужно для того, чтобы showEvent() был вызван в производном классе 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() мой виджет ... Я не имею в виду код не имеет эффект и при размещении точки останова он не останавливается на нем, поэтому я предполагаю, что событие не срабатывает.

Что я делаю неправильно?

EDIT - добавить еще немного кода и точность:

Я использую 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 не вызывается.

+0

Как вы называете это шоу 'show'? –

+0

Чтобы вызвать 'showEvent', вам просто нужно сделать то, что вы * сказали * вы сделали. Вот [минимальный пример] (http://pastebin.com/3FCjuS990). Если вы тестируете, поставив точку прерывания, возможно, вы не подключили отладчик к вашему приложению. если вы используете Qt Creator, вам нужно использовать кнопку «Начать отладки» 'F5' (а не кнопку« Запустить »' ctrl + R'). – Mike

+0

@Jonathan Mee: прямое вызов слота 'show()' от другого виджета, владеющего этим виджетами – RDK

ответ

1

Я отвечаю мой собственный вопрос, поскольку, в конце концов, это не проблема программирования. Что-то, должно быть, пошло не так с компиляцией/отладкой.

Для справки, вот что делать, если в коде все правильно, но по какой-то причине freakin не вызывается функция (возможно, это может произойти только с повторными реализациями обработчиков событий Qt?).

Это произошло с помощью QtCreator 3.0.0 с Qt 5.2.0 MSVC2010 - 32 бита

  1. Очистить проект: Меню Build-> Clean All
  2. Закрыть QtCreator
  3. Перейти к вашей сборки -project/debug и удалите файлы .exe, .pdb и .ilk.
  4. Перейдите в папку вашего проекта/кэша и удалите папку с тем же именем, что и ваш проект, дополненный .pdb (папка yourproject.pdb) - не уверен, что я f это необходимо, но я сделал это, поэтому я тоже его записываю

  5. Перезапустить QtCreator, qmake, построить и запустить/отладить (и tadaaa!)

«Простой» чистый все не сделал трюк, даже перезагрузка компьютера. Мне пришлось вручную удалить файлы, которые не были удалены QtCreator.

Я надеюсь, что это может помочь кому-то в будущем, сэкономив пару часов.

1

Чтобы установить точку останова в визуальной студии см это: 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(); 


} 
Смежные вопросы