3. QT窗体间值的传递(续)

一、前言

上篇博客中通过重载子窗体的构造函数将主窗体的值传入到子窗体,但是在子窗体运行过程中如何才能将值动态的传入到子窗体?可以有两种办法,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 }

三、实现效果

   

时间: 2024-09-26 20:09:12

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

QT窗体间值的传递

一.主窗体与子窗体传参 方法有很多,这里介绍一种通过重载子窗体的构造函数实现主窗体参数传入到子窗体,并通过QT信号和槽的机制实现子窗口到主窗口值的传递. 主和子窗体的设置如下: 主要实现功能为: 1 主窗口LineEdit控件按下Enter键后,弹出Dialog窗体并显示与主窗体一样的内容: 2 子窗体按下pushButton按钮后,主窗口显示子窗口内容. 二.功能1  主窗体到子窗体传值 头文件如下: 子窗体: 1 #ifndef DIALOG_H 2 #define DIALOG_H 3 4

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

在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后,准备献丑了. 1.       如果很多窗体都需要用到某一窗体的东西,比如登录窗体记录的ID,为了避免每个窗体都去查询数据库,可以把这些公共变量或信息写入配置文件,每个窗体去读配置文件即可. 2.       如果共享信息的窗体不多,则对于兄弟窗口,可以通过其共同的父窗体来传递数据,此时父窗体如果

不同的线程间值的传递

在C# 的应用程序开发中,我们经常要把UI线程和工作线程分开,防止界面停止响应.同时我们又需要在工作线程中更新UI界面上的控件下面介绍几种常用的方法阅读目录线程间操作无效第一种办法:禁止编译器对跨线程访问做检查第二种办法: 使用delegate和invoke来从其他线程中调用控件第三种办法: 使用delegate和BeginInvoke来从其他线程中控制控件第四种办法: 使用BackgroundWorker组件

ArcEngine中两个窗体间地图的传递

                  第一个窗口 Editfrm frm = new Editfrm();//实例化第二个窗口 frm.Tag = axMapControl1.Map;//在Tag属性中存储,第一个窗口的地图 frm.Show(); 第二个窗口 axMapControl.Map=(IMap).Tag;//获取地图

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

刚开始看的时候看的云里雾里的,现在稍微明白一点了.现在假设有一个form,一个MainWindow,如图所示: 实现点击PushButton,将文本框中的内容传输到MainWindow中,显示为Label.界面我已经提前画好.下面是备份代码: form.h: #ifndef FORM_H #define FORM_H #include <QWidget> namespace Ui { class Form; } class Form : public QWidget { Q_OBJECT pu

WinForm多窗体间操作,ComboBox下拉菜单控件

1.通过操作一个窗体打开另一个窗体 已有窗体为Form1.Form1中有一个按钮,对该按钮编写点击事件: Form2 f2 = new Form2();f2.Show(); 通过这段代码来打开Form2. 在实际应用中会出现代开Form2后需要Form1隐藏的情况,此时可以加入代码:this.Hide();来实现隐藏Form1. [不能关闭Form1,如果关闭Form1,那么Form2也会关闭,因为Form1是主窗体] 2.在窗体之间进行值的传递 在某些情况下,需要用到某个已经获取到的值,为了提

窗体间传递数据(跨控件跨类),三种情况与处理方法

环境:Qt5.5 MCVS2013 IDE:QtCreator 范例代码下载地址:http://download.csdn.net/detail/shihoongbo/9134859 发现很多Qt的初学者,经常会在“窗体间如何传递数据”的问题上卡住,而网上通常只是简单描述为使用信号与槽(signal& slot)机制来传递 虽然信号与槽的传递方式确实没错,但是却不一定能适用到全部的情况. 所以,总结了窗体间传递数据的三种情况和对应方法: 模型描述:  已知三个窗体,A为B C的父控件,B与C互为

wp8.1 Study1: 页面导航&amp;页面间值传递

摘要:wp8.1与wp8中很多API是不一样了,wp8.1把以前wp7.x时的api去掉了,更多与win8.1的API相似.比如以下的页面导航和页面之间的值传递 1.页面导航 利用Frame.Navigate() 方法,C#语句如下: 1 Frame.Navigate(typeof(Page2));//Page2为一个页面的名称 这里需要注意的是此方法是可以重载的,即后面介绍的页面间值传递方法. 2.页面间值传递 这里利用Frame.Navigate()重载方法,进行单个值传递和多个值传递 1)

C# 窗体间传递数据

C#两个窗体之间传递数据 1 公用变量值传递 public partial class Form1 : Form //parent form { public string name=""; public Form1() { InitializeComponent(); } private void newBtn_Click(object sender, EventArgs e) { Form2 form2 =new Form2(); form2.ShowDialog(); if (f