一、前言
上篇博客中通过重载子窗体的构造函数将主窗体的值传入到子窗体,但是在子窗体运行过程中如何才能将值动态的传入到子窗体?可以有两种办法,1、信号和槽的方式传值;2、主窗体中将传出值设置为public
本文主要实现功能为:鼠标点击主窗体的GraphicsView中的Scene时,将对应像素处的各个波段值传递给子窗体的TabelView并显示。其中子窗体的接受主窗体的值是通过2(public)的方式,简单方便。
二、主、子窗体的设计
定义子窗体类:ShowPixelData
主要实现:1 接受主窗体传入的文件名、当前点击图像的行、列号;
2 根据传入值,读取并显示pixel data;
头文件如下:
1 #ifndef SHOWPIXELDATA_H 2 #define SHOWPIXELDATA_H 3 4 #include <QDialog> 5 #include <QStandardItemModel> 6 #include "hyperprocess.h" 7 8 class HyperProcess; 9 10 namespace Ui { 11 class ShowPixelData; 12 } 13 14 class ShowPixelData : public QDialog 15 { 16 Q_OBJECT 17 18 public: 19 ShowPixelData(QWidget *parent = 0); 20 ~ShowPixelData(); 21 22 23 private slots: 24 void receiveHyperToPixelDataSlot(); // 接受鼠标单击信号 25 void exitShowPixelDataSlot(); // 26 27 signals: 28 void sendExit(); // 29 30 private: 31 Ui::ShowPixelData *ui; 32 HyperProcess *ptr; 33 34 QStandardItemModel *myPixelData; 35 36 int currentRow; // 行 37 int currentCol; // 列 38 QString curFileName; // 文件名 39 }; 40 41 #endif // SHOWPIXELDATA_H
源文件如下:
1 #include "ShowPixelData.h" 2 #include "ui_ShowPixelData.h" 3 4 5 ShowPixelData::ShowPixelData(QWidget *parent) : 6 QDialog(parent), 7 ui(new Ui::ShowPixelData) 8 { 9 ui->setupUi(this); 10 11 currentRow = -1; 12 currentCol = -1; 13 curFileName = ""; 14 ptr = (HyperProcess*)parentWidget(); //获得主窗体的指针 15 16 ui->pixelInfo->setText("Pixel Info"); 17 myPixelData = new QStandardItemModel; 18 myPixelData->setColumnCount(2); 19 myPixelData->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("Band")<<QStringLiteral("Data")); 20 ui->pixelDataView->setModel(myPixelData);// 初始化 21 ui->pixelDataView->setEditTriggers(QAbstractItemView::NoEditTriggers); 22 ui->pixelDataView->setColumnWidth(0,75); 23 ui->pixelDataView->setColumnWidth(1,80); 24 25 connect(ptr,SIGNAL(sendSignalToShowPixelData()),this,SLOT(receiveHyperToPixelDataSlot())); 26 connect(ui->ExitButton,SIGNAL(clicked()),this,SLOT(exitShowPixelDataSlot())); 27 } 28 29 ShowPixelData::~ShowPixelData() 30 { 31 delete ui; 32 } 33 34 void ShowPixelData::receiveHyperToPixelDataSlot() 35 { 36 curFileName = ptr->curFileName; 37 currentRow = ptr->curRow; 38 currentCol = ptr->curCol; 39 40 if(curFileName == "") 41 { 42 QMessageBox::information(this,"Message Error","Current Scene IS NULL!"); 43 return; 44 } 45 46 if(currentCol == -1 || currentRow == -1) 47 { 48 QMessageBox::information(this,"Message Error","please Select A Pixel"); 49 return; 50 } 51 52 cv::Mat curImg = GDALOpenCV::GDAL2Mat(curFileName); 53 if(currentCol > curImg.cols || currentRow > curImg.rows) 54 return; 55 56 int count = curImg.channels(); 57 ui->pixelInfo->setText(QString("pixel:(%1,%2)").arg(currentRow+1).arg(currentCol+1)); 58 59 std::vector<cv::Mat> curImgMat(count); 60 cv::split(curImg,curImgMat); 61 QVector<float> pixSpectralData(count); 62 63 myPixelData->clear(); 64 myPixelData->setColumnCount(2); 65 myPixelData->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("Band")<<QStringLiteral("Data")); 66 ui->pixelDataView->setModel(myPixelData); 67 ui->pixelDataView->setEditTriggers(QAbstractItemView::NoEditTriggers); 68 ui->pixelDataView->setColumnWidth(0,75); 69 ui->pixelDataView->setColumnWidth(1,75); 70 for(int c = 0;c<count;c++) 71 { 72 pixSpectralData[c] = curImgMat[c].at<float>(currentCol,currentRow); 73 myPixelData->setItem(c,0,new QStandardItem(tr("band%1").arg(QString::number(c+1, 10)))); 74 myPixelData->setItem(c,1,new QStandardItem(QString("%1").arg(pixSpectralData[c]))); 75 } 76 ui->pixelDataView->setModel(myPixelData); 77 78 } 79 80 void ShowPixelData::exitShowPixelDataSlot() 81 { 82 emit sendExit(); 83 close(); 84 }
主窗体类:HyperProcess
实现功能:1 传出鼠标点击信号;
2 public声明,并且动态改变相应的输出值
头文件如下:
1 private slots: 2 void ShowPixelDataSlot(); // 显示子窗体槽 3 void receiveRowColSlot(int,int); // 从主窗体的GraphicsView接收行、列号,并传出信号 4 5 signals: 6 void sendSignalToShowPixelData(); 7 8 public: 9 int curRow; 10 int curCol; 11 QString curFileName;
源文件:
1 void HyperProcess::ShowPixelDataSlot() 2 { 3 if(currentSceneIndex == -1) 4 { 5 QMessageBox::information(this,"Message Error","please Open At Least One Image!"); 6 return; 7 }else 8 { 9 myShowPixelData = new ShowPixelData(this); 10 myShowPixelData->show(); 11 connect(myShowPixelData,SIGNAL(sendExit()),this,SLOT(receiveShowPixelDataSlot())); 12 myImg->setCursor(Qt::CrossCursor); 13 return; 14 } 15 } 16 17 void HyperProcess::receiveRowColSlot(int row,int col) 18 { 19 curCol = col; 20 curRow = row; 21 emit sendSignalToShowPixelData(); 22 } 23 24 void HyperProcess::receiveShowPixelDataSlot() 25 { 26 myImg->setCursor(Qt::ArrowCursor); 27 }
三、实现效果
放松不放纵--忙碌不盲目