I understand that the QtGUI has changed significantly from Qt4 to Qt5.
- I want to create a DLL that has a user interface (GUI).
- This DLL must work with third party applications that have their own user interface.
- The third party applications can be written in Qt, .NET, MFC, and other programming languages other than C/C++.
- I created a DLL that displays a modeless dialog box in Qt 4.8.4 and works as designed.
- When I upgraded the DLL for Qt 5.1.1:
- The widgets (combo-box, push button, check box) on the dialog box no longer respond to mouse clicks.
- The frame is active and the dialog box can be moved around.
- The window repaints when obscured/exposed by another window.
- The model I am using was provided by the twain consortium and is similar to other sample code I located on this and other forums.
For example, the main entry function in the DLL launches a thread for the QApplication:
// Coerce the QCoreApplication instance if it exists to a QApplication.
if (pApp)
{
// Test for consistency between the application QT version and
// the one for the DS.
int nV1App = 0;
int nV2App = 0;
int nV3App = 0;
SSCANF(qVersion(),"%d.%d.%d",&nV1App, &nV2App, &nV3App);
int nV1DS = (BYTE)(QT_VERSION>>16);
int nV2DS = (BYTE)(QT_VERSION>>8);
// int nV3DS = (BYTE)QT_VERSION;
if (nV1App < nV1DS || (nV1App == nV1DS && nV2App < nV2DS))
return TWRC_FAILURE;
}
if (!pApp)
{
#ifdef TWNDS_OS_WIN
_get_pgmptr(&pWinAppName);
m_pUIThread = new UIThread(this, UIInfo);
m_pUIThread->start();
// Wait on the semaphore for the thread to start running
// and that the thread has launched the dialog box.
ScanXGUIEnabledSem.acquire(1);
#endif
// Coerce the QCoreApplication instance if it exists to a QApplication.
QApplication * pApp = qApp;
if (pApp)
{
// Test for consistency between the application QT version and
// the one for the DS.
int nV1App = 0;
int nV2App = 0;
int nV3App = 0;
SSCANF(qVersion(),"%d.%d.%d",&nV1App, &nV2App, &nV3App);
int nV1DS = (BYTE)(QT_VERSION>>16);
int nV2DS = (BYTE)(QT_VERSION>>8);
// int nV3DS = (BYTE)QT_VERSION;
if (nV1App < nV1DS || (nV1App == nV1DS && nV2App < nV2DS))
return TWRC_FAILURE;
}
if (!pApp)
{
#ifdef TWNDS_OS_WIN
_get_pgmptr(&pWinAppName);
m_pUIThread = new UIThread(this, UIInfo);
m_pUIThread->start();
// Wait on the semaphore for the thread to start running
// and that the thread has launched the dialog box.
ScanXGUIEnabledSem.acquire(1);
#endif
To copy to clipboard, switch view to plain text mode
The thread (m_pUIThread) creates the QApplication in its run method:
void UIThread::run()
{
// Launch a QApplciation. (Windows only)
// There are no command line arguments.
int argc = 1;
if (m_pQtApp)
{
#ifdef TWNDS_OS_WIN
// Create the dlg and make it visible.
m_pDlg = new ScanXGUI(m_pUI, m_pChildWnd);
if (m_pDlg)
{
pScanXDlg = m_pDlg;
// Register to receive events.
m_pQtApp->installEventFilter(m_pDlg);
// Display the UI.
m_pDlg->show();
ScanXGUIEnabledSem.release(1);
// Launch the message loop and do not return until thread closes.
m_pQtApp->exec();
// Ensure that the dialog box and class are destroyed.
// done() causes the local event loop to finish.
int CloseResult = 1;
m_pDlg->done(CloseResult);
delete m_pDlg;
m_pDlg = NULL;
}
#endif
delete m_pQtApp;
}
m_pQtApp = NULL;
}
void UIThread::run()
{
// Launch a QApplciation. (Windows only)
// There are no command line arguments.
int argc = 1;
m_pQtApp = new QApplication(argc, &pWinAppName);
if (m_pQtApp)
{
#ifdef TWNDS_OS_WIN
// Create the dlg and make it visible.
m_pDlg = new ScanXGUI(m_pUI, m_pChildWnd);
if (m_pDlg)
{
pScanXDlg = m_pDlg;
// Register to receive events.
m_pQtApp->installEventFilter(m_pDlg);
// Display the UI.
m_pDlg->show();
ScanXGUIEnabledSem.release(1);
// Launch the message loop and do not return until thread closes.
m_pQtApp->exec();
// Ensure that the dialog box and class are destroyed.
// done() causes the local event loop to finish.
int CloseResult = 1;
m_pDlg->done(CloseResult);
delete m_pDlg;
m_pDlg = NULL;
}
#endif
delete m_pQtApp;
}
m_pQtApp = NULL;
}
To copy to clipboard, switch view to plain text mode
Bookmarks