Use of ResultDialog and ProcessingItem

This commit is contained in:
MSN 2013-11-26 10:44:00 +04:00
parent a4879c8f91
commit c7c9d72bd7
13 changed files with 331 additions and 91 deletions

View File

@ -16,44 +16,53 @@
#include "GlobalActionHelper.h"
#include "Recognizer.h"
#include "Translator.h"
#include "ResultDialog.h"
Manager::Manager(QObject *parent) :
QObject(parent),
trayIcon_ (new QSystemTrayIcon (QIcon (":/images/icon.png"), this)),
selection_ (new SelectionDialog),
resultDialog_ (new ResultDialog),
captureAction_ (NULL)
{
GlobalActionHelper::init ();
qRegisterMetaType<ProcessingItem>();
selection_->setWindowIcon (trayIcon_->icon ());
connect (this, SIGNAL (showPixmap (QPixmap)),
selection_, SLOT (setPixmap (QPixmap)));
// Recognizer
Recognizer* recognizer = new Recognizer;
connect (selection_, SIGNAL (selected (QPixmap)),
recognizer, SLOT (recognize (QPixmap)));
connect (selection_, SIGNAL (selected (ProcessingItem)),
recognizer, SLOT (recognize (ProcessingItem)));
connect (recognizer, SIGNAL (error (QString)),
SLOT (showError (QString)));
connect (this, SIGNAL (settingsEdited ()),
recognizer, SLOT (applySettings ()));
QThread* recognizerThread = new QThread (this);
recognizer->moveToThread (recognizerThread);
recognizerThread->start ();
// Translator
Translator* translator = new Translator;
connect (recognizer, SIGNAL (recognized (QString)),
translator, SLOT (translate (QString)));
connect (recognizer, SIGNAL (recognized (ProcessingItem)),
translator, SLOT (translate (ProcessingItem)));
connect (translator, SIGNAL (error (QString)),
SLOT (showError (QString)));
connect (this, SIGNAL (settingsEdited ()),
translator, SLOT (applySettings ()));
QThread* translatorThread = new QThread (this);
translator->moveToThread (translatorThread);
translatorThread->start ();
connect (translator, SIGNAL (translated (QString, QString)),
SLOT (showTranslation (QString, QString)));
connect (translator, SIGNAL (translated (ProcessingItem)),
SLOT (showResult (ProcessingItem)));
connect (this, SIGNAL (showPixmap (QPixmap)),
selection_, SLOT (setPixmap (QPixmap)));
connect (this, SIGNAL (settingsEdited ()), this, SLOT (applySettings ()));
connect (this, SIGNAL (settingsEdited ()), recognizer, SLOT (applySettings ()));
connect (this, SIGNAL (settingsEdited ()), translator, SLOT (applySettings ()));
selection_->setWindowIcon (trayIcon_->icon ());
resultDialog_->setWindowIcon (trayIcon_->icon ());
connect (trayIcon_, SIGNAL (activated (QSystemTrayIcon::ActivationReason)),
SLOT (processTrayAction (QSystemTrayIcon::ActivationReason)));
@ -151,11 +160,12 @@ void Manager::about()
message.exec ();
}
void Manager::showTranslation(QString sourceText, QString translatedText)
void Manager::showResult(ProcessingItem item)
{
lastMessage_ = sourceText + " - " + translatedText;
qDebug () << sourceText << translatedText;
trayIcon_->showMessage (tr ("Перевод"), lastMessage_, QSystemTrayIcon::Information);
resultDialog_->showResult (item);
// lastMessage_ = sourceText + " - " + translatedText;
// qDebug () << sourceText << translatedText;
// trayIcon_->showMessage (tr ("Перевод"), lastMessage_, QSystemTrayIcon::Information);
}
void Manager::showError(QString text)

View File

@ -4,10 +4,13 @@
#include <QPixmap>
#include <QSystemTrayIcon>
#include "ProcessingItem.h"
class QAction;
class QMenu;
class SelectionDialog;
class ResultDialog;
class Manager : public QObject
{
@ -18,7 +21,6 @@ class Manager : public QObject
signals:
void showPixmap (QPixmap pixmap);
void recognize (QPixmap pixmap);
void settingsEdited ();
private slots:
@ -31,7 +33,7 @@ class Manager : public QObject
void processTrayAction (QSystemTrayIcon::ActivationReason reason);
void showTranslation (QString sourceText, QString translatedText);
void showResult (ProcessingItem item);
void showError (QString text);
private:
@ -40,6 +42,7 @@ class Manager : public QObject
private:
QSystemTrayIcon* trayIcon_;
SelectionDialog* selection_;
ResultDialog* resultDialog_;
QAction* captureAction_;
QString lastMessage_;
};

15
ProcessingItem.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef PROCESSINGITEM_H
#define PROCESSINGITEM_H
#include <QPixmap>
struct ProcessingItem
{
QPoint screenPos;
QPixmap source;
QString recognized;
QString translated;
};
Q_DECLARE_METATYPE(ProcessingItem)
#endif // PROCESSINGITEM_H

View File

@ -1,6 +1,6 @@
#include "Recognizer.h"
#include <tesseract/baseapi.h>
//#include <tesseract/baseapi.h>
#include <QDebug>
#include <QSettings>
@ -35,63 +35,67 @@ void Recognizer::applySettings()
bool Recognizer::initEngine()
{
if (tessDataDir_.isEmpty () || ocrLanguage_.isEmpty ())
{
emit error (tr ("Неверные параметры для OCR"));
return false;
}
if (engine_ != NULL)
{
delete engine_;
}
engine_ = new tesseract::TessBaseAPI();
int result = engine_->Init(qPrintable (tessDataDir_), qPrintable (ocrLanguage_),
tesseract::OEM_DEFAULT);
if (result != 0)
{
emit error (tr ("Ошибка инициализации OCR: %1").arg (result));
delete engine_;
engine_ = NULL;
return false;
}
return true;
// if (tessDataDir_.isEmpty () || ocrLanguage_.isEmpty ())
// {
// emit error (tr ("Неверные параметры для OCR"));
// return false;
// }
// if (engine_ != NULL)
// {
// delete engine_;
// }
// engine_ = new tesseract::TessBaseAPI();
// int result = engine_->Init(qPrintable (tessDataDir_), qPrintable (ocrLanguage_),
// tesseract::OEM_DEFAULT);
// if (result != 0)
// {
// emit error (tr ("Ошибка инициализации OCR: %1").arg (result));
// delete engine_;
// engine_ = NULL;
// return false;
// }
// return true;
}
void Recognizer::recognize(QPixmap pixmap)
void Recognizer::recognize(ProcessingItem item)
{
Q_ASSERT (!pixmap.isNull ());
if (engine_ == NULL)
{
if (!initEngine ())
{
Q_ASSERT (!item.source.isNull ());
item.recognized = "test rec";
emit recognized (item);
return;
}
}
// if (engine_ == NULL)
// {
// if (!initEngine ())
// {
// return;
// }
// }
QPixmap scaled = pixmap;
if (imageScale_ > 0)
{
scaled = pixmap.scaledToHeight (pixmap.height () * imageScale_,
Qt::SmoothTransformation);
}
QImage image = scaled.toImage ();
const int bytesPerPixel = image.depth () / 8;
engine_->SetImage (image.bits (), image.width (), image.height (),
bytesPerPixel, image.bytesPerLine ());
// QPixmap scaled = pixmap;
// if (imageScale_ > 0)
// {
// scaled = pixmap.scaledToHeight (pixmap.height () * imageScale_,
// Qt::SmoothTransformation);
// }
// QImage image = scaled.toImage ();
// const int bytesPerPixel = image.depth () / 8;
// engine_->SetImage (image.bits (), image.width (), image.height (),
// bytesPerPixel, image.bytesPerLine ());
char* outText = engine_->GetUTF8Text();
engine_->Clear();
// char* outText = engine_->GetUTF8Text();
// engine_->Clear();
QString result (outText);
result = result.trimmed();
if (!result.isEmpty ())
{
emit recognized (result);
emit recognized (pixmap, result);
}
else
{
emit error (tr ("Текст не распознан."));
}
delete [] outText;
// QString result (outText);
// result = result.trimmed();
// if (!result.isEmpty ())
// {
// item.recognized = result;
// emit recognized (result);
// emit recognized (pixmap, result);
// }
// else
// {
// emit error (tr ("Текст не распознан."));
// }
// delete [] outText;
}

View File

@ -4,6 +4,7 @@
#include <QObject>
#include "QPixmap"
#include "ProcessingItem.h"
namespace tesseract
{
@ -17,12 +18,11 @@ class Recognizer : public QObject
explicit Recognizer(QObject *parent = 0);
signals:
void recognized (QString text);
void recognized (QPixmap pixmap, QString text);
void recognized (ProcessingItem item);
void error (QString text);
public slots:
void recognize (QPixmap pixmap);
void recognize (ProcessingItem item);
void applySettings ();
private:

62
ResultDialog.cpp Normal file
View File

@ -0,0 +1,62 @@
#include "ResultDialog.h"
#include "ui_ResultDialog.h"
#include <QDesktopWidget>
ResultDialog::ResultDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ResultDialog),
isShowAtCapturePos_ (true)
{
ui->setupUi(this);
setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint |
Qt::WindowStaysOnTopHint);
installEventFilter (this);
}
ResultDialog::~ResultDialog()
{
delete ui;
}
bool ResultDialog::eventFilter(QObject* object, QEvent* event)
{
Q_UNUSED (object);
if (event->type () == QEvent::MouseButtonRelease)
{
hide ();
}
return QDialog::eventFilter (object, event);
}
void ResultDialog::showResult(ProcessingItem item)
{
Q_ASSERT (!item.source.isNull ());
Q_ASSERT (!item.recognized.isEmpty ());
Q_ASSERT (!item.translated.isEmpty ());
Q_ASSERT (!item.screenPos.isNull ());
ui->sourceLabel->setPixmap (item.source);
ui->recognizeLabel->setText (item.recognized);
ui->translateLabel->setText (item.translated);
adjustSize ();
if (isShowAtCapturePos_)
{
QPoint correction = QPoint (ui->frame->lineWidth (), ui->frame->lineWidth ());
move (item.screenPos - correction);
}
else
{
QDesktopWidget* desktop = QApplication::desktop ();
Q_CHECK_PTR (desktop);
QRect screenRect = desktop->availableGeometry (this);
Q_ASSERT (screenRect.isValid ());
QPoint newPos (screenRect.width () - width (), screenRect.height () - height ());
move (newPos);
}
show ();
}

31
ResultDialog.h Normal file
View File

@ -0,0 +1,31 @@
#ifndef RESULTDIALOG_H
#define RESULTDIALOG_H
#include <QDialog>
#include "ProcessingItem.h"
namespace Ui {
class ResultDialog;
}
class ResultDialog : public QDialog
{
Q_OBJECT
public:
explicit ResultDialog(QWidget *parent = 0);
~ResultDialog();
public:
bool eventFilter (QObject *object, QEvent *event);
public slots:
void showResult (ProcessingItem item);
private:
Ui::ResultDialog *ui;
bool isShowAtCapturePos_;
};
#endif // RESULTDIALOG_H

98
ResultDialog.ui Normal file
View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ResultDialog</class>
<widget class="QDialog" name="ResultDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>260</width>
<height>222</height>
</rect>
</property>
<property name="windowTitle">
<string>Результат</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="sourceLabel">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="recognizeLabel">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="translateLabel">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -11,9 +11,9 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = ScreenTranslator
TEMPLATE = app
INCLUDEPATH += C:/build/include
#INCLUDEPATH += C:/build/include
LIBS += -LC:/build/bin -ltesseract
#LIBS += -LC:/build/bin -ltesseract
SOURCES += main.cpp\
Manager.cpp \
@ -21,7 +21,8 @@ SOURCES += main.cpp\
SelectionDialog.cpp \
GlobalActionHelper.cpp \
Recognizer.cpp \
Translator.cpp
Translator.cpp \
ResultDialog.cpp
HEADERS += \
Manager.h \
@ -30,11 +31,14 @@ HEADERS += \
GlobalActionHelper.h \
Recognizer.h \
Translator.h \
Settings.h
Settings.h \
ProcessingItem.h \
ResultDialog.h
FORMS += \
SettingsEditor.ui \
SelectionDialog.ui
SelectionDialog.ui \
ResultDialog.ui
RESOURCES += \
Recources.qrc

View File

@ -52,7 +52,10 @@ bool SelectionDialog::eventFilter(QObject* object, QEvent* event)
QPixmap selectedPixmap = currentPixmap_.copy (selection);
if (!selectedPixmap.isNull ())
{
emit selected (selectedPixmap);
ProcessingItem item;
item.source = selectedPixmap;
item.screenPos = selection.topLeft ();
emit selected (item);
accept ();
}
}

View File

@ -4,6 +4,8 @@
#include <QDialog>
#include <QPixmap>
#include "ProcessingItem.h"
namespace Ui {
class SelectionDialog;
}
@ -19,7 +21,7 @@ class SelectionDialog : public QDialog
bool eventFilter (QObject *object, QEvent *event);
signals:
void selected (QPixmap pixmap);
void selected (ProcessingItem pixmap);
public slots:
void setPixmap (QPixmap pixmap);

View File

@ -35,20 +35,26 @@ void Translator::applySettings()
toString ();
}
void Translator::translate(QString text)
void Translator::translate(ProcessingItem item)
{
Q_ASSERT (!text.isEmpty ());
Q_ASSERT (!item.recognized.isEmpty ());
item.translated = "проверка";
emit translated (item);
return;
if (translationLanguage_.isEmpty ())
{
emit error (tr ("Неверные парметры для перевода."));
return;
}
QUrl url (translateBaseUrl.arg (text, translationLanguage_));
network_.get (QNetworkRequest (url));
QUrl url (translateBaseUrl.arg (item.recognized, translationLanguage_));
QNetworkReply* reply = network_.get (QNetworkRequest (url));
items_.insert (reply, item);
}
void Translator::replyFinished(QNetworkReply* reply)
{
Q_ASSERT (items_.contains (reply));
ProcessingItem item = items_.take (reply);
Q_ASSERT (reply->isFinished ());
if (reply->error () != QNetworkReply::NoError)
{
@ -73,7 +79,6 @@ void Translator::replyFinished(QNetworkReply* reply)
}
QJsonArray answerArray = document.array ();
QJsonArray fullTranslation = answerArray.first ().toArray ();
QString source = "";
QString translation = "";
foreach (QJsonValue part, fullTranslation)
{
@ -83,7 +88,7 @@ void Translator::replyFinished(QNetworkReply* reply)
continue;
}
translation += partTranslation.at (0).toString ();
source += partTranslation.at (1).toString ();
}
emit translated (source, translation);
item.translated = translation;
emit translated (item);
}

View File

@ -3,6 +3,8 @@
#include <QNetworkAccessManager>
#include "ProcessingItem.h"
class Translator : public QObject
{
Q_OBJECT
@ -10,11 +12,11 @@ class Translator : public QObject
explicit Translator(QObject *parent = 0);
signals:
void translated (QString sourceText, QString translatedText);
void translated (ProcessingItem item);
void error (QString text);
public slots:
void translate (QString text);
void translate (ProcessingItem item);
void applySettings ();
private slots:
@ -23,6 +25,7 @@ class Translator : public QObject
private:
QNetworkAccessManager network_;
QString translationLanguage_;
QHash<QNetworkReply*, ProcessingItem> items_;
};