Qt twain interface - Qt3->Qt4

Alles rund um die Programmierung mit Qt
qtoBSn
Beiträge: 8
Registriert: 2. Februar 2007 16:11

Qt twain interface - Qt3->Qt4

Beitrag von qtoBSn »

Hi,

erstmal Hallo in die Runde.

Qt ist für mich relativ neu bis jetzt habe ich mich immer Java durchgeschlagen.
Meine kleine Anwendung mit Qt4 und ner Datenbank rennt auch schon. *freu*

Jetzt stellt sich die Anforderung eine Scanner-Schnittstelle zu integrieren.
Dabei bin auf das gestoßen:

:arrow: http://www.nowecor.de/users/stephan/qt/ ... ml?id=1013

Diese Anwendung wurde mit/für/unter(?) Qt3 geschrieben.
Kennt diese Klassen bereits jemand oder hat diese vllt. schon zu Ot4 portiert?
Bin gern auch bereit entsprechend Geld dafür zu zahlen.

Grüße qtoBSn
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Das sollte nicht so schwer das nach Qt4 zu bringen. Das kannste ja mal am WE machen.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Außerdem solltest du dir besser WIA statt twain anschauen. Da das die neue Schnittstelle unter Windows ist. Näheres findest du im Windows SDK. Wobei es natürlich besser währe beides zu unterstützen. Zum Testen habe ich aber leider keinen WIA kompatiblen Scanner.
Die TWAIN Doku findes du hier
Mit TWAIN hättest du den Vorteil, das dein Programm auch unter Mac OS laufen würde:) Ich würde auch auf Twain setzen, da mit Twain 2.0 (befindet sich in der Entwicklung) eine Schnittstelle für alle Systeme entsteht(Linux,Mac,Windows). Es kommt drauf an, wo dein Programm laufen soll. Wenn es nur unter Windoof laufen soll, könnte WIA leichter sein. Nur sind nur wenige Scanner WIA fähig.
qtoBSn
Beiträge: 8
Registriert: 2. Februar 2007 16:11

Beitrag von qtoBSn »

Danke erstmal,

für mich kommt auf jedenfall nur die Twain-Schnittstelle in Frage.
Die Software muß unter OS X laufen.

So bei mir hakt´s jetzt aber an dieser Stelle:

qtwaininterface.cpp

Code: Alles auswählen

QPixmap* QTwainInterface::convertToPixmap(CDIB* pDib, unsigned int nWidth, unsigned int nHeight)
{	
	if (!pDib)
		return 0;

	unsigned int nUseWidth  = nWidth;
	unsigned int nUseHeight = nHeight;

	if (nUseWidth == 0)
		nUseWidth = pDib->Width();
	if (nUseHeight == 0)
		nUseHeight = pDib->Height();

	QPixmap* retval = new QPixmap(nUseWidth, nUseHeight);	
	pDib->BitBlt(retval->handle(), 
		         0, 0, 
				 nUseWidth, nUseHeight,
				 0, 0);

	return retval;
} // !convertToPixmap()
Soweit ich mich jetzt schlau gemacht habe, hat QPixmap kein handle mehr.
Und BitBlt sollte man auch nicht mehr verwenden.
hilby
Beiträge: 31
Registriert: 31. Mai 2006 16:26

Beitrag von hilby »

Hallo willkommen im Team :lol:

Ich versuche auch schon seit einer Woche diese Schnittstelle
nach Qt 4 zu portieren.

also die Stelle oben habe ich umgebaut zu:

Code: Alles auswählen

...
pDib->BitBlt((HDC)retval, 0, 0, nUseWidth, nUseHeight, 0, 0);
...

ich habe das Paket auch soweit zum Laufen bekommen, dass der Scanner-Dialog aufpoppt (also aquire Image) - nur wenn ich dann scanne
wird der Prozess nicht abgeschlossen - also der Dialog weiss nicht, wohin mit dem Bild....es ist zum heulen!

Der Trolltech-Support (wir sind Lizenznehmer) ist dazu leider absolut keine Hilfe ! :cry:

wenn Du Fragen zu einzelnenDateien hast - stelle sie !
wenn Du Fortschritte erzielt hast lass es mich wissen
:D

mfg
hilby
hilby
Beiträge: 31
Registriert: 31. Mai 2006 16:26

Beitrag von hilby »

Hi,
habe grad zum Thema folgende Antwort von Trolltech bekommen:

Hello,

There is no API in Qt for Twain support, but we have a suggestion listed
for this in the Task Tracker and you can track it with id 72809 here:

http://www.trolltech.com/developer/task-tracker
http://www.trolltech.com/customers/area/task-tracker

The link you provided above

http://www.nowecor.de/users/stephan/index.php?page=qt/

is not from Trolltech. From looking at that page the program only has
been built against Qt 3. You would have to port the program to Qt 4 to
build it against Qt 4. I suggest you ask the authors of the page if
this is something they are planning to do. Alternatively, you can try
porting the program yourself, see:

http://doc.trolltech.com/4.2/porting4.html
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Unter Linux könnte man Twain auch ohne sane wrapper nutzen, wenn die neue Twain Norm fertig ist. Was dazu führen dürfte, das es mehr Scanner gibt, die unter Linux/Unix laufen. Da man nur noch eine Schnittstelle pflegen muss. Und wenn Qt das könnte währe es echt noch besser.
qtoBSn
Beiträge: 8
Registriert: 2. Februar 2007 16:11

Beitrag von qtoBSn »

Hallo hilby, hallo BartSimpson,

freut mich Interesse geweckt zu haben.

Ich selber konnte die Sache noch nicht weiterbringen, nächste Woche wollte ich mich wieder damit beschäftigen.
scanne wird der Prozess nicht abgeschlossen - also der Dialog weiss nicht, wohin mit dem Bild....es ist zum heulen!
Nur so ne Vermutung. Dann hängts denke ich mal noch an der Abfrage die von Scanner-Interface zurückkommt. Versuch mal folgende processMessage auf true zu belassen.

Code: Alles auswählen

bool QTwain::processMessage(MSG& msg)
{
	if (msg.message == 528) // don't really know why...
		return false;

	if (m_hMessageWnd == 0)
		return false;
	return (ProcessMessage(msg) == TRUE);
} // !processMessage()
Wenn du deine Files bereitstellen möchtest, können wir gern am Mo, Di die Sache weiter voranbringen.

Schönes WE,

Grüße qtoBSn
hilby
Beiträge: 31
Registriert: 31. Mai 2006 16:26

Beitrag von hilby »

Hallo qtoBSn, hallo BartSimpson

ich habe mal das Paket unter :
http://www.mediamax.com/hilby/Hosted/qtwqain_xmpl.zip
zum Download bereitgestellt.

Ist ein Code.Block-Projektfile dabei

wie gesagt, funktioniert bis zum scannen....

Vielleicht kommst Du/Ihr weiter !
mfg
hilby
qtoBSn
Beiträge: 8
Registriert: 2. Februar 2007 16:11

Beitrag von qtoBSn »

Hallo hilby,

vielen Dank erstmal.

Ich habe den Transfer jetzt erstmal manuell ausgelöst:

In twaincpp.cpp Zeile 420
BOOL CTwain::Acquire(int numImages)
{
if(DSOpen() || OpenSource())
{
if(SetImageCount(numImages))
{
if(EnableSource())
{
QMessageBox::information(0,"Acquire", "EnableSource = true");

//manueller Transfer;
TransferImage();

return TRUE;
}
}
}
return FALSE;
}
QTwainInterface::convertToPixmap wird dann erfolgreich aufgerufen. Also Verarbeitung sollte dann eigentlich funktionieren.

Wenn das Scanner-Interface geöffnet ist wird auf jedenfall kein einziges TW_EVENT ausgelöst.
void CTwain::TranslateMessage(TW_EVENT& twEvent)
{
switch(twEvent.TWMessage)
{
case MSG_XFERREADY:
TransferImage();
break;
case MSG_CLOSEDSREQ:
if(CanClose())
{
CloseDS();
}
break;
}
}
In dib.cpp Zeile 233
void CDIB::BitBlt(HDC hDest,int nXDest,int nYDest,int nWidth,int nHeight,int xSrc,int ySrc)
{
//SetDIBitsToDevice(hDest,nXDest,nYDest,nWidth,nHeight,xSrc,Height()-ySrc-nHeight,0,Height(),m_pBits,m_pInfo,DIB_RGB_COLORS);
}

void CDIB::StretchBlt(HDC hDest,int nXDest,int nYDest,int nDWidth,int nDHeight,int xSrc,int ySrc,int nSWidth,int nSHeight)
{
int err;
//err = StretchDIBits(hDest,nXDest,nYDest,nDWidth,nDHeight,xSrc,ySrc,nSWidth,nSHeight,m_pBits,(CONST BITMAPINFO * )&m_pInfo->bmiHeader,DIB_RGB_COLORS,SRCCOPY);
}
Sonst kann ich gar nicht complieren?!
qtoBSn
Beiträge: 8
Registriert: 2. Februar 2007 16:11

Beitrag von qtoBSn »

Das Scanner Interface liefert nichts das winEvent zurück:

Code: Alles auswählen

bool QTwainMainWindow::winEvent(MSG* pMsg)
{
	QMessageBox::information(0,"QTwainMainWindow::winEvent", "MSG* pMsg!");
	return (m_pTwain->processMessage(*pMsg) == TRUE);
} // !winEvent()
qtoBSn
Beiträge: 8
Registriert: 2. Februar 2007 16:11

Beitrag von qtoBSn »

OK.

Ändere in qtwainmainwindow.cpp

Code: Alles auswählen

bool QTwainMainWindow::winEvent(MSG* pMsg, long * result)
{
	//QMessageBox::information(0,"QTwainMainWindow::winEvent", "MSG* pMsg!");
	return (m_pTwain->processMessage(*pMsg) == TRUE);
} // !winEvent()
und in qtwainmainwindow.h

Code: Alles auswählen

bool winEvent(MSG * pMsg, long * result);
Nun blockiert aber noch das PaintEvent jegliche Eingabe.
hilby
Beiträge: 31
Registriert: 31. Mai 2006 16:26

Beitrag von hilby »

cool,

Danke :D
Das bringt mich einen Schritt weiter.
Jetzt scannt er wenigstens.

ich habe das Gefühl, das das Interface noch iregendwie mit
Signalen und Slots verbunden werden muss....

na, ich experimentiere mal noch ein wenig damit rum

:D
hilby
Beiträge: 31
Registriert: 31. Mai 2006 16:26

Beitrag von hilby »

nee,

mit den letzten Änderungen an der qtwainmainwindow.cpp / .h
geht garnix mehr - da hab ich nur ein unsichtbares Widget mit drei button, die nicht mehr reagieren :cry:

komisch
qtoBSn
Beiträge: 8
Registriert: 2. Februar 2007 16:11

Beitrag von qtoBSn »

ich habe das Gefühl, das das Interface noch iregendwie mit
Signalen und Slots verbunden werden muss....
Das genau macht das winEvent:

Code: Alles auswählen

bool QTwainMainWindow::winEvent(MSG* pMsg, long * result)
{
   //QMessageBox::information(0,"QTwainMainWindow::winEvent", "MSG* pMsg!");
   return (m_pTwain->processMessage(*pMsg) == TRUE);
} // !winEvent()
Ich compiliere bereits ohne qt3support.
Das Paintevent ist meiner Meinung absolut überflüssig.[/quote]
Antworten