Memory management fix for QT dialog windows. Ensure that window is marked for deletion when it is closed.

This commit is contained in:
Matthew Budd 2020-08-25 20:59:36 -04:00
parent a624278fca
commit c23fa5dc60
20 changed files with 175 additions and 55 deletions

View File

@ -416,12 +416,22 @@ GuiCheatsDialog_t::~GuiCheatsDialog_t(void)
} }
wasPausedByCheats = false; wasPausedByCheats = false;
printf("Destroy Cheat Window Event\n");
}
//----------------------------------------------------------------------------
void GuiCheatsDialog_t::closeEvent(QCloseEvent *event)
{
printf("Cheat Close Window Event\n");
done(0);
deleteLater();
event->accept();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void GuiCheatsDialog_t::closeWindow(void) void GuiCheatsDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); //printf("Close Window\n");
done(0); done(0);
deleteLater();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int GuiCheatsDialog_t::addSearchResult (uint32_t a, uint8_t last, uint8_t current) int GuiCheatsDialog_t::addSearchResult (uint32_t a, uint8_t last, uint8_t current)

View File

@ -33,6 +33,7 @@ class GuiCheatsDialog_t : public QDialog
int activeCheatListCB (char *name, uint32 a, uint8 v, int c, int s, int type, void *data); int activeCheatListCB (char *name, uint32 a, uint8 v, int c, int s, int type, void *data);
protected: protected:
void closeEvent(QCloseEvent *event);
QGroupBox *actCheatFrame; QGroupBox *actCheatFrame;
QGroupBox *cheatSearchFrame; QGroupBox *cheatSearchFrame;

View File

@ -1,5 +1,7 @@
// ConsoleSoundConf.cpp // ConsoleSoundConf.cpp
// //
#include <QCloseEvent>
#include "../../fceu.h" #include "../../fceu.h"
#include "../../driver.h" #include "../../driver.h"
#include "Qt/ConsoleSoundConf.h" #include "Qt/ConsoleSoundConf.h"
@ -217,7 +219,22 @@ ConsoleSndConfDialog_t::ConsoleSndConfDialog_t(QWidget *parent)
//---------------------------------------------------- //----------------------------------------------------
ConsoleSndConfDialog_t::~ConsoleSndConfDialog_t(void) ConsoleSndConfDialog_t::~ConsoleSndConfDialog_t(void)
{ {
printf("Destroy Sound Config Window\n");
}
//----------------------------------------------------------------------------
void ConsoleSndConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Sound Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void ConsoleSndConfDialog_t::closeWindow(void)
{
//printf("Sound Close Window\n");
done(0);
deleteLater();
} }
//---------------------------------------------------- //----------------------------------------------------
void ConsoleSndConfDialog_t::setCheckBoxFromProperty( QCheckBox *cbx, const char *property ) void ConsoleSndConfDialog_t::setCheckBoxFromProperty( QCheckBox *cbx, const char *property )

View File

@ -25,6 +25,8 @@ class ConsoleSndConfDialog_t : public QDialog
~ConsoleSndConfDialog_t(void); ~ConsoleSndConfDialog_t(void);
protected: protected:
void closeEvent(QCloseEvent *event);
QCheckBox *enaChkbox; QCheckBox *enaChkbox;
QCheckBox *enaLowPass; QCheckBox *enaLowPass;
QCheckBox *swapDutyChkbox; QCheckBox *swapDutyChkbox;
@ -44,6 +46,7 @@ class ConsoleSndConfDialog_t : public QDialog
void setSliderFromProperty( QSlider *slider, QLabel *lbl, const char *property ); void setSliderFromProperty( QSlider *slider, QLabel *lbl, const char *property );
private slots: private slots:
void closeWindow(void);
void bufSizeChanged(int value); void bufSizeChanged(int value);
void volumeChanged(int value); void volumeChanged(int value);
void triangleChanged(int value); void triangleChanged(int value);

View File

@ -1,5 +1,7 @@
// ConsoleVideoConf.cpp // ConsoleVideoConf.cpp
// //
#include <QCloseEvent>
#include "../../fceu.h" #include "../../fceu.h"
#include "Qt/main.h" #include "Qt/main.h"
#include "Qt/dface.h" #include "Qt/dface.h"
@ -105,7 +107,7 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
button = new QPushButton( tr("Close") ); button = new QPushButton( tr("Close") );
hbox1->addWidget( button ); hbox1->addWidget( button );
connect(button, SIGNAL(clicked()), this, SLOT(closewindow(void)) ); connect(button, SIGNAL(clicked()), this, SLOT(closeWindow(void)) );
main_vbox->addLayout( hbox1 ); main_vbox->addLayout( hbox1 );
@ -115,8 +117,24 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
//---------------------------------------------------- //----------------------------------------------------
ConsoleVideoConfDialog_t::~ConsoleVideoConfDialog_t(void) ConsoleVideoConfDialog_t::~ConsoleVideoConfDialog_t(void)
{ {
printf("Destroy Video Config Window\n");
} }
//----------------------------------------------------------------------------
void ConsoleVideoConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Video Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void ConsoleVideoConfDialog_t::closeWindow(void)
{
//printf("Video Config Close Window\n");
done(0);
deleteLater();
}
//---------------------------------------------------- //----------------------------------------------------
void ConsoleVideoConfDialog_t::resetVideo(void) void ConsoleVideoConfDialog_t::resetVideo(void)
{ {
@ -237,8 +255,3 @@ void ConsoleVideoConfDialog_t::applyChanges( void )
resetVideo(); resetVideo();
} }
//---------------------------------------------------- //----------------------------------------------------
void ConsoleVideoConfDialog_t::closewindow( void )
{
done(0);
}
//----------------------------------------------------

View File

@ -25,6 +25,8 @@ class ConsoleVideoConfDialog_t : public QDialog
~ConsoleVideoConfDialog_t(void); ~ConsoleVideoConfDialog_t(void);
protected: protected:
void closeEvent(QCloseEvent *bar);
QComboBox *driverSelect; QComboBox *driverSelect;
QComboBox *regionSelect; QComboBox *regionSelect;
QCheckBox *gl_LF_chkBox; QCheckBox *gl_LF_chkBox;
@ -40,6 +42,9 @@ class ConsoleVideoConfDialog_t : public QDialog
void resetVideo(void); void resetVideo(void);
public slots:
void closeWindow(void);
private slots: private slots:
void use_new_PPU_changed( int value ); void use_new_PPU_changed( int value );
void frameskip_changed( int value ); void frameskip_changed( int value );
@ -49,7 +54,6 @@ class ConsoleVideoConfDialog_t : public QDialog
void regionChanged(int index); void regionChanged(int index);
void driverChanged(int index); void driverChanged(int index);
void applyChanges( void ); void applyChanges( void );
void closewindow( void );
}; };

View File

@ -75,8 +75,6 @@ consoleWin_t::consoleWin_t(QWidget *parent)
emulatorThread->start(); emulatorThread->start();
gamePadConfWin = NULL;
} }
consoleWin_t::~consoleWin_t(void) consoleWin_t::~consoleWin_t(void)
@ -85,10 +83,8 @@ consoleWin_t::~consoleWin_t(void)
gameTimer->stop(); gameTimer->stop();
if ( gamePadConfWin != NULL ) closeGamePadConfWindow();
{
gamePadConfWin->closeWindow();
}
fceuWrapperLock(); fceuWrapperLock();
fceuWrapperClose(); fceuWrapperClose();
fceuWrapperUnLock(); fceuWrapperUnLock();
@ -144,11 +140,8 @@ void consoleWin_t::QueueErrorMsgWindow( const char *msg )
void consoleWin_t::closeEvent(QCloseEvent *event) void consoleWin_t::closeEvent(QCloseEvent *event)
{ {
//printf("Main Window Close Event\n"); //printf("Main Window Close Event\n");
if ( gamePadConfWin != NULL ) closeGamePadConfWindow();
{
//printf("Command Game Pad Close\n");
gamePadConfWin->closeWindow();
}
event->accept(); event->accept();
closeApp(); closeApp();
@ -901,9 +894,9 @@ void consoleWin_t::loadLua(void)
luaCtrlWin = new LuaControlDialog_t(this); luaCtrlWin = new LuaControlDialog_t(this);
luaCtrlWin->show(); luaCtrlWin->show();
luaCtrlWin->exec(); //luaCtrlWin->exec();
delete luaCtrlWin; //delete luaCtrlWin;
//printf("Lua Control Window Destroyed\n"); //printf("Lua Control Window Destroyed\n");
#endif #endif
@ -911,20 +904,9 @@ void consoleWin_t::loadLua(void)
void consoleWin_t::openGamePadConfWin(void) void consoleWin_t::openGamePadConfWin(void)
{ {
if ( gamePadConfWin != NULL )
{
printf("GamePad Config Window Already Open\n");
return;
}
//printf("Open GamePad Config Window\n"); //printf("Open GamePad Config Window\n");
gamePadConfWin = new GamePadConfDialog_t(this);
gamePadConfWin->show(); openGamePadConfWindow(this);
gamePadConfWin->exec();
delete gamePadConfWin;
gamePadConfWin = NULL;
//printf("GamePad Config Window Destroyed\n");
} }
void consoleWin_t::openGameSndConfWin(void) void consoleWin_t::openGameSndConfWin(void)
@ -936,9 +918,9 @@ void consoleWin_t::openGameSndConfWin(void)
sndConfWin = new ConsoleSndConfDialog_t(this); sndConfWin = new ConsoleSndConfDialog_t(this);
sndConfWin->show(); sndConfWin->show();
sndConfWin->exec(); //sndConfWin->exec();
delete sndConfWin; //delete sndConfWin;
//printf("Sound Config Window Destroyed\n"); //printf("Sound Config Window Destroyed\n");
} }
@ -952,9 +934,9 @@ void consoleWin_t::openGameVideoConfWin(void)
vidConfWin = new ConsoleVideoConfDialog_t(this); vidConfWin = new ConsoleVideoConfDialog_t(this);
vidConfWin->show(); vidConfWin->show();
vidConfWin->exec(); //vidConfWin->exec();
delete vidConfWin; //delete vidConfWin;
//printf("Video Config Window Destroyed\n"); //printf("Video Config Window Destroyed\n");
} }
@ -968,9 +950,9 @@ void consoleWin_t::openHotkeyConfWin(void)
hkConfWin = new HotKeyConfDialog_t(this); hkConfWin = new HotKeyConfDialog_t(this);
hkConfWin->show(); hkConfWin->show();
hkConfWin->exec(); //hkConfWin->exec();
delete hkConfWin; //delete hkConfWin;
//printf("Hotkey Config Window Destroyed\n"); //printf("Hotkey Config Window Destroyed\n");
} }
@ -984,9 +966,9 @@ void consoleWin_t::openPaletteConfWin(void)
paletteConfWin = new PaletteConfDialog_t(this); paletteConfWin = new PaletteConfDialog_t(this);
paletteConfWin->show(); paletteConfWin->show();
paletteConfWin->exec(); //paletteConfWin->exec();
delete paletteConfWin; //delete paletteConfWin;
//printf("Palette Config Window Destroyed\n"); //printf("Palette Config Window Destroyed\n");
} }
@ -1000,9 +982,9 @@ void consoleWin_t::openGuiConfWin(void)
guiConfWin = new GuiConfDialog_t(this); guiConfWin = new GuiConfDialog_t(this);
guiConfWin->show(); guiConfWin->show();
guiConfWin->exec(); //guiConfWin->exec();
delete guiConfWin; //delete guiConfWin;
//printf("GUI Config Window Destroyed\n"); //printf("GUI Config Window Destroyed\n");
} }
@ -1016,9 +998,9 @@ void consoleWin_t::openCheats(void)
cheatWin = new GuiCheatsDialog_t(this); cheatWin = new GuiCheatsDialog_t(this);
cheatWin->show(); cheatWin->show();
cheatWin->exec(); //cheatWin->exec();
delete cheatWin; //delete cheatWin;
//printf("GUI Cheat Window Destroyed\n"); //printf("GUI Cheat Window Destroyed\n");
} }
@ -1032,9 +1014,9 @@ void consoleWin_t::openHexEditor(void)
hexEditWin = new HexEditorDialog_t(this); hexEditWin = new HexEditorDialog_t(this);
hexEditWin->show(); hexEditWin->show();
hexEditWin->exec(); //hexEditWin->exec();
delete hexEditWin; //delete hexEditWin;
//printf("GUI Hex Editor Window Destroyed\n"); //printf("GUI Hex Editor Window Destroyed\n");
} }
@ -1412,9 +1394,9 @@ void consoleWin_t::aboutFCEUX(void)
aboutWin = new AboutWindow(this); aboutWin = new AboutWindow(this);
aboutWin->show(); aboutWin->show();
aboutWin->exec(); //aboutWin->exec();
delete aboutWin; //delete aboutWin;
//printf("About Window Destroyed\n"); //printf("About Window Destroyed\n");
return; return;

View File

@ -99,8 +99,6 @@ class consoleWin_t : public QMainWindow
emulatorThread_t *emulatorThread; emulatorThread_t *emulatorThread;
GamePadConfDialog_t *gamePadConfWin;
std::string errorMsg; std::string errorMsg;
bool errorMsgValid; bool errorMsgValid;

View File

@ -36,6 +36,30 @@ struct GamePadConfigLocalData_t
static GamePadConfigLocalData_t lcl[GAMEPAD_NUM_DEVICES]; static GamePadConfigLocalData_t lcl[GAMEPAD_NUM_DEVICES];
static GamePadConfDialog_t *gamePadConfWin = NULL;
//----------------------------------------------------
int openGamePadConfWindow( QWidget *parent )
{
if ( gamePadConfWin != NULL )
{
return -1;
}
gamePadConfWin = new GamePadConfDialog_t(parent);
gamePadConfWin->show();
return 0;
}
//----------------------------------------------------
int closeGamePadConfWindow(void)
{
if ( gamePadConfWin != NULL )
{
gamePadConfWin->closeWindow();
}
return 0;
}
//---------------------------------------------------- //----------------------------------------------------
GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
: QDialog( parent ) : QDialog( parent )
@ -56,6 +80,8 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
std::string prefix; std::string prefix;
char stmp[256]; char stmp[256];
gamePadConfWin = this;
// Ensure that joysticks are enabled, no harm calling init again. // Ensure that joysticks are enabled, no harm calling init again.
InitJoysticks(); InitJoysticks();
@ -279,6 +305,9 @@ GamePadConfDialog_t::~GamePadConfDialog_t(void)
{ {
inputTimer->stop(); inputTimer->stop();
buttonConfigStatus = 0; buttonConfigStatus = 0;
gamePadConfWin = NULL;
printf("GamePad Window Deleted\n");
} }
void GamePadConfDialog_t::keyPressEvent(QKeyEvent *event) void GamePadConfDialog_t::keyPressEvent(QKeyEvent *event)
{ {
@ -500,6 +529,7 @@ void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
printf("GamePad Close Window Event\n"); printf("GamePad Close Window Event\n");
buttonConfigStatus = 0; buttonConfigStatus = 0;
done(0); done(0);
deleteLater();
event->accept(); event->accept();
} }
//---------------------------------------------------- //----------------------------------------------------
@ -510,6 +540,7 @@ void GamePadConfDialog_t::closeWindow(void)
printf("Close Window\n"); printf("Close Window\n");
buttonConfigStatus = 0; buttonConfigStatus = 0;
done(0); done(0);
deleteLater();
} }
//---------------------------------------------------- //----------------------------------------------------
void GamePadConfDialog_t::changeButton0(void) void GamePadConfDialog_t::changeButton0(void)

View File

@ -99,3 +99,7 @@ class GamePadConfDialog_t : public QDialog
void updatePeriodic(void); void updatePeriodic(void);
}; };
int openGamePadConfWindow( QWidget *parent );
int closeGamePadConfWindow(void);

View File

@ -46,13 +46,22 @@ GuiConfDialog_t::GuiConfDialog_t(QWidget *parent)
//---------------------------------------------------- //----------------------------------------------------
GuiConfDialog_t::~GuiConfDialog_t(void) GuiConfDialog_t::~GuiConfDialog_t(void)
{ {
printf("Destroy GUI Config Close Window\n");
}
//----------------------------------------------------------------------------
void GuiConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("GUI Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
} }
//---------------------------------------------------- //----------------------------------------------------
void GuiConfDialog_t::closeWindow(void) void GuiConfDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); //printf("Close Window\n");
done(0); done(0);
deleteLater();
} }
//---------------------------------------------------- //----------------------------------------------------
void GuiConfDialog_t::useNativeFileDialogChanged(int state) void GuiConfDialog_t::useNativeFileDialogChanged(int state)

View File

@ -26,6 +26,8 @@ class GuiConfDialog_t : public QDialog
~GuiConfDialog_t(void); ~GuiConfDialog_t(void);
protected: protected:
void closeEvent(QCloseEvent *event);
QCheckBox *useNativeFileDialog; QCheckBox *useNativeFileDialog;
QCheckBox *useNativeMenuBar; QCheckBox *useNativeMenuBar;
private: private:

View File

@ -468,6 +468,7 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
HexEditorDialog_t::~HexEditorDialog_t(void) HexEditorDialog_t::~HexEditorDialog_t(void)
{ {
printf("Hex Editor Deleted\n");
periodicTimer->stop(); periodicTimer->stop();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -487,10 +488,19 @@ void HexEditorDialog_t::populateBookmarkMenu(void)
bookmarkMenu->addSeparator(); bookmarkMenu->addSeparator();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void HexEditorDialog_t::closeEvent(QCloseEvent *event)
{
printf("Hex Editor Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void HexEditorDialog_t::closeWindow(void) void HexEditorDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); //printf("Close Window\n");
done(0); done(0);
deleteLater();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void HexEditorDialog_t::pickForeGroundColor(void) void HexEditorDialog_t::pickForeGroundColor(void)

View File

@ -138,6 +138,7 @@ class HexEditorDialog_t : public QDialog
~HexEditorDialog_t(void); ~HexEditorDialog_t(void);
protected: protected:
void closeEvent(QCloseEvent *bar);
void gotoAddress(int newAddr); void gotoAddress(int newAddr);
void populateBookmarkMenu(void); void populateBookmarkMenu(void);

View File

@ -7,6 +7,7 @@
#include <SDL.h> #include <SDL.h>
#include <QHeaderView> #include <QHeaderView>
#include <QCloseEvent>
#include "Qt/main.h" #include "Qt/main.h"
#include "Qt/dface.h" #include "Qt/dface.h"
@ -68,13 +69,22 @@ HotKeyConfDialog_t::HotKeyConfDialog_t(QWidget *parent)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
HotKeyConfDialog_t::~HotKeyConfDialog_t(void) HotKeyConfDialog_t::~HotKeyConfDialog_t(void)
{ {
printf("Destroy Hot Key Config Window\n");
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Hot Key Close Window Event\n");
done(0);
deleteLater();
event->accept();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void HotKeyConfDialog_t::closeWindow(void) void HotKeyConfDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); //printf("Close Window\n");
done(0); done(0);
deleteLater();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void HotKeyConfDialog_t::assignHotkey(QKeyEvent *event) void HotKeyConfDialog_t::assignHotkey(QKeyEvent *event)

View File

@ -27,6 +27,7 @@ class HotKeyConfDialog_t : public QDialog
~HotKeyConfDialog_t(void); ~HotKeyConfDialog_t(void);
protected: protected:
void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event);
void assignHotkey(QKeyEvent *event); void assignHotkey(QKeyEvent *event);

View File

@ -102,6 +102,8 @@ LuaControlDialog_t::~LuaControlDialog_t(void)
{ {
std::list <LuaControlDialog_t*>::iterator it; std::list <LuaControlDialog_t*>::iterator it;
printf("Destroy Lua Control Window\n");
for (it = winList.begin(); it != winList.end(); it++) for (it = winList.begin(); it != winList.end(); it++)
{ {
if ( (*it) == this ) if ( (*it) == this )
@ -113,10 +115,19 @@ LuaControlDialog_t::~LuaControlDialog_t(void)
} }
} }
//---------------------------------------------------- //----------------------------------------------------
void LuaControlDialog_t::closeEvent(QCloseEvent *event)
{
printf("Lua Control Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------
void LuaControlDialog_t::closeWindow(void) void LuaControlDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); //printf("Lua Control Close Window\n");
done(0); done(0);
deleteLater();
} }
//---------------------------------------------------- //----------------------------------------------------
void LuaControlDialog_t::openLuaScriptFile(void) void LuaControlDialog_t::openLuaScriptFile(void)

View File

@ -29,6 +29,8 @@ class LuaControlDialog_t : public QDialog
void refreshState(void); void refreshState(void);
protected: protected:
void closeEvent(QCloseEvent *bar);
QLineEdit *scriptPath; QLineEdit *scriptPath;
QLineEdit *scriptArgs; QLineEdit *scriptArgs;
QPushButton *browseButton; QPushButton *browseButton;

View File

@ -148,13 +148,22 @@ PaletteConfDialog_t::PaletteConfDialog_t(QWidget *parent)
//---------------------------------------------------- //----------------------------------------------------
PaletteConfDialog_t::~PaletteConfDialog_t(void) PaletteConfDialog_t::~PaletteConfDialog_t(void)
{ {
printf("Destroy Palette Config Window\n");
}
//----------------------------------------------------------------------------
void PaletteConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Palette Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
} }
//---------------------------------------------------- //----------------------------------------------------
void PaletteConfDialog_t::closeWindow(void) void PaletteConfDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); //printf("Close Window\n");
done(0); done(0);
deleteLater();
} }
//---------------------------------------------------- //----------------------------------------------------
void PaletteConfDialog_t::hueChanged(int v) void PaletteConfDialog_t::hueChanged(int v)

View File

@ -26,6 +26,8 @@ class PaletteConfDialog_t : public QDialog
~PaletteConfDialog_t(void); ~PaletteConfDialog_t(void);
protected: protected:
void closeEvent(QCloseEvent *event);
QLineEdit *custom_palette_path; QLineEdit *custom_palette_path;
QCheckBox *useCustom; QCheckBox *useCustom;
QCheckBox *GrayScale; QCheckBox *GrayScale;