一、前言

上篇博客中通过重载子窗体的构造函数将主窗体的值传入到子窗体,但是在子窗体运行过程中如何才能将值动态的传入到子窗体?可以有两种办法,1、信号和槽的方式传值;2、主窗体中将传出值设置为public

本文主要实现功能为:鼠标点击主窗体的GraphicsView中的Scene时,将对应像素处的各个波段值传递给子窗体的TabelView并显示。其中子窗体的接受主窗体的值是通过2(public)的方式,简单方便。

二、主、子窗体的设计

定义子窗体类:ShowPixelData

主要实现:1 接受主窗体传入的文件名、当前点击图像的行、列号;

2 根据传入值,读取并显示pixel data;

头文件如下:

 #ifndef SHOWPIXELDATA_H
#define SHOWPIXELDATA_H #include <QDialog>
#include <QStandardItemModel>
#include "hyperprocess.h" class HyperProcess; namespace Ui {
class ShowPixelData;
} class ShowPixelData : public QDialog
{
Q_OBJECT public:
ShowPixelData(QWidget *parent = );
~ShowPixelData(); private slots:
void receiveHyperToPixelDataSlot(); // 接受鼠标单击信号
void exitShowPixelDataSlot(); // signals:
void sendExit(); // private:
Ui::ShowPixelData *ui;
HyperProcess *ptr; QStandardItemModel *myPixelData; int currentRow; // 行
int currentCol; // 列
QString curFileName; // 文件名
}; #endif // SHOWPIXELDATA_H

源文件如下:

 #include "ShowPixelData.h"
#include "ui_ShowPixelData.h" ShowPixelData::ShowPixelData(QWidget *parent) :
QDialog(parent),
ui(new Ui::ShowPixelData)
{
ui->setupUi(this); currentRow = -;
currentCol = -;
curFileName = "";
ptr = (HyperProcess*)parentWidget(); //获得主窗体的指针 ui->pixelInfo->setText("Pixel Info");
myPixelData = new QStandardItemModel;
myPixelData->setColumnCount();
myPixelData->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("Band")<<QStringLiteral("Data"));
ui->pixelDataView->setModel(myPixelData);// 初始化
ui->pixelDataView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->pixelDataView->setColumnWidth(,);
ui->pixelDataView->setColumnWidth(,); connect(ptr,SIGNAL(sendSignalToShowPixelData()),this,SLOT(receiveHyperToPixelDataSlot()));
connect(ui->ExitButton,SIGNAL(clicked()),this,SLOT(exitShowPixelDataSlot()));
} ShowPixelData::~ShowPixelData()
{
delete ui;
} void ShowPixelData::receiveHyperToPixelDataSlot()
{
curFileName = ptr->curFileName;
currentRow = ptr->curRow;
currentCol = ptr->curCol; if(curFileName == "")
{
QMessageBox::information(this,"Message Error","Current Scene IS NULL!");
return;
} if(currentCol == - || currentRow == -)
{
QMessageBox::information(this,"Message Error","please Select A Pixel");
return;
} cv::Mat curImg = GDALOpenCV::GDAL2Mat(curFileName);
if(currentCol > curImg.cols || currentRow > curImg.rows)
return; int count = curImg.channels();
ui->pixelInfo->setText(QString("pixel:(%1,%2)").arg(currentRow+).arg(currentCol+)); std::vector<cv::Mat> curImgMat(count);
cv::split(curImg,curImgMat);
QVector<float> pixSpectralData(count); myPixelData->clear();
myPixelData->setColumnCount();
myPixelData->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("Band")<<QStringLiteral("Data"));
ui->pixelDataView->setModel(myPixelData);
ui->pixelDataView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->pixelDataView->setColumnWidth(,);
ui->pixelDataView->setColumnWidth(,);
for(int c = ;c<count;c++)
{
pixSpectralData[c] = curImgMat[c].at<float>(currentCol,currentRow);
myPixelData->setItem(c,,new QStandardItem(tr("band%1").arg(QString::number(c+, ))));
myPixelData->setItem(c,,new QStandardItem(QString("%1").arg(pixSpectralData[c])));
}
ui->pixelDataView->setModel(myPixelData); } void ShowPixelData::exitShowPixelDataSlot()
{
emit sendExit();
close();
}

主窗体类:HyperProcess

实现功能:1 传出鼠标点击信号;

2 public声明,并且动态改变相应的输出值

头文件如下:

 private slots:
void ShowPixelDataSlot(); // 显示子窗体槽
void receiveRowColSlot(int,int); // 从主窗体的GraphicsView接收行、列号,并传出信号 signals:
void sendSignalToShowPixelData(); public:
int curRow;
int curCol;
QString curFileName;

源文件:

 void HyperProcess::ShowPixelDataSlot()
{
if(currentSceneIndex == -)
{
QMessageBox::information(this,"Message Error","please Open At Least One Image!");
return;
}else
{
myShowPixelData = new ShowPixelData(this);
myShowPixelData->show();
connect(myShowPixelData,SIGNAL(sendExit()),this,SLOT(receiveShowPixelDataSlot()));
myImg->setCursor(Qt::CrossCursor);
return;
}
} void HyperProcess::receiveRowColSlot(int row,int col)
{
curCol = col;
curRow = row;
emit sendSignalToShowPixelData();
} void HyperProcess::receiveShowPixelDataSlot()
{
myImg->setCursor(Qt::ArrowCursor);
}

三、实现效果

   

3. QT窗体间值的传递(续)的更多相关文章

  1. 2. QT窗体间值的传递

    一.主窗体与子窗体传参 方法有很多,这里介绍一种通过重载子窗体的构造函数实现主窗体参数传入到子窗体,并通过QT信号和槽的机制实现子窗口到主窗口值的传递. 主和子窗体的设置如下: 主要实现功能为: 1 ...

  2. C#不同窗体间通信,数据传递

    在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...

  3. WinForm登陆:窗体间的数据传递

    1. 登陆逻辑 FrmMain 为主窗体(启动窗体) FrmLogin 为登陆窗体 在“主窗体”中使用ShowDialog()方法显示“登陆窗体”,并通过“登陆窗体”的DialogResult告知“主 ...

  4. qt 窗体间通信

    利用qt的信号和槽,可以完成窗体间的通信,下面列出父子窗口利用信号和槽的相关代码. parent窗口: //parent.h #ifndef PARENT_H #define PARENT_H #in ...

  5. QT窗体间传值总结之Signal&Slot

    在写程序时,难免会碰到多窗体之间进行传值的问题.依照自己的理解,我把多窗体传值的可以使用的方法归纳如下: 1.使用QT中的Signal&Slot机制进行传值: 2.使用全局变量: 3.使用pu ...

  6. Iframe之间及iframe与父窗体之间值的传递

    方法一:ScriptManager.RegisterClientScriptBlock(this,typeof(Page), "NoInformation", "wind ...

  7. Qt 窗体间传值(代码备份)

    刚开始看的时候看的云里雾里的,现在稍微明白一点了.现在假设有一个form,一个MainWindow,如图所示: 实现点击PushButton,将文本框中的内容传输到MainWindow中,显示为Lab ...

  8. C#不同窗体间数据传递

    在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念.最常见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道. 1.       如果很多窗体都需要用到某一窗体的东西,比如登录窗体记 ...

  9. 小菜学习Winform(五)窗体间传递数据

    前言 做项目的时候,winfrom因为没有B/S的缓存机制,窗体间传递数据没有B/S页面传递数据那么方便,今天我们就说下winfrom中窗体传值的几种方式. 共有字段传递 共有字段传递实现起来很方便, ...

随机推荐

  1. Gson源码分析之Json结构抽象和注解使用

    github上的博客地址: http://chuyun923.github.io/blog/2015/01/06/gsonyuan-ma-fen-xi/ XML和Json作为最常用的两种网络传输格式而 ...

  2. 重写OnPaint事件对窗体重绘 实例1

    public class WindowOne:Form { public WindowOne() { InitializeCompnent(); } public void InitializeCom ...

  3. 安装软件配置VC++环境时常出现的问题--Error 1935.安装程序集

    装很多软件是都要配置VC++环境的,但由于系统注册表限制,很多时候软件安装过程中会报如下错误 安装 vc++2005 运行库 Error 1935.安装程序集 Microsoft.vc80.atl,t ...

  4. 关于sql2005 与 myeclipse进行连接出现的小问题

    C盘目录下没有jdbc这个文件夹,所以从网上下一个 这个是2008连接jdbc用的 正常解压第一个到相应的目录 主要是注意一个叫tcp/ip的协议,米有找到64位的 点击这里的tcp ip就哦了但是他 ...

  5. OD调试学习笔记7—去除未注册版软件的使用次数限制

    OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需 ...

  6. 关于发布DIPS的MVC项目的IIS 7.0环境配置的方法

    本人技术笨拙,今天在发布DIPS的MVC4.0项目,并部署到IIS上,遇到各种问题.在查询相关资料后,最终得以解决,所以想把这个过程记录下来. 注:DIPS为一种非关系型数据库 首先,需要安装和注册D ...

  7. JS判断,今天所在季度,第几周, 季度的第几周,年度第几周

    <html> <head> <title>日期判断 周 月 季 年</title> <script type="text/javascr ...

  8. 8 Hbase get方式获取数据

    package com.hikvision.hbase.vertify.test; import org.apache.hadoop.conf.Configuration; import org.ap ...

  9. 用UseMiddleware扩展方法注册中间件类

    用UseMiddleware扩展方法注册中间件类 .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件 ...

  10. c#添加事物(全部执行和带保存点的执行)

    全部执行 protected void Button2_Click(object sender, EventArgs e) { // 执行事务 SqlConnection con = new SqlC ...