08 createActions;
09 createMenus;
10 statusBar->showMessage(tr("Ready"), 2000);
11 connect(&thread, SIGNAL(transactionStarted(const QString &)),
12 statusBar, SLOT(showMessage(const QString &)));
13 connect(&thread, SIGNAL(finished),
14 this, SLOT(allTransactionsDone));
15 setCurrentFile("");
16 }
Интересной частью конструктора
01 void ImageWindow::flipHorizontally
02 {
03 addTransaction(new FlipTransaction(Qt::Horizontal));
04 }
Слот
01 void ImageWindow::addTransaction(Transaction *transact)
02 {
03 thread.addTransaction(transact);
04 openAction->setEnabled(false);
05 saveAction->setEnabled(false);
06 saveAsAction->setEnabled(false);
07 }
Функция
01 void ImageWindow::allTransactionsDone
02 {
03 openAction->setEnabled(true);
04 saveAction->setEnabled(true);
05 saveAsAction->setEnabled(true);
06 imageLabel->setPixmap(QPixmap::fromImage(thread.image));
07 setWindowModified(true);
08 statusBar->showMessage(tr("Ready"), 2000);
09 }
Слот
Теперь давайте рассмотрим класс
01 class TransactionThread : public QThread
02 {
03 Q_OBJECT
04 public:
05 void addTransaction(Transaction *transact);
06 void setImage(const QImage ℑ);
07 QImage image;
08 signals:
09 void transactionStarted(const QString &message);
10 protected:
11 void run;
12 private:
13 QMutex mutex;
14 QImage currentImage;
15 QQueue
16 };
Класс
01 void TransactionThread::addTransaction(Transaction *transact)
02 {
03 QMutexLocker locker(&mutex);
04 transactions.enqueue(transact);
05 if (!isRunning)
06 start;
07 }
Функция
01 void TransactionThread::setImage(const QImage ℑ)
02 {
03 QMutexLocker locker(&mutex);
04 currentImage = image;
05 }
06 QImage TransactionThread::image
07 {
08 QMutexLocker locker(&mutex);
09 return currentImage;
10 }