系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
前言
随着科学计算的日益广泛,矩阵运算在各个领域得到越来越多的应用,实现一个功能全面且易于使用的矩阵计算器显得尤为重要。本文设计并实现了一个基于Qt的矩阵计算器,具有矩阵的基本运算、转置、求逆等功能。
该计算器具有简洁的图形界面,用户可以方便地输入矩阵数据,选择所需的计算操作,并实时显示运算结果。相比传统的命令行界面,图形界面的矩阵计算器对用户更加友好,降低了使用难度。本文首先阐述了矩阵运算的基础知识,如矩阵的表示、加减法、数乘等运算规则。然后描述了基于Qt框架构建图形界面的设计思路,包括界面布局、各控件的添加。关键部分是利用Qt的信号和槽机制实现矩阵运算功能,根据用户的输入数据和选择的计算模式,调用Qt中的数学函数库进行矩阵运算,并更新显示结果。开发过程中,设计合理的界面的布局,使各功能模块区分明确且易操作,是关键所在。
本文对界面设计的思路进行了详细的描述。另外,如何解析用户输入,进行错误检查,以及如何组织运算函数的调用流程,也是实际编码实现时需要注意的点。该矩阵计算器具有一定的参考意义,可以为相关专业的教学提供支持。
提示:以下是本篇文章正文内容,下面案例仅供参考
一、整体程序展示
二、函数的实现
1.整体GUI控件布置
QFont fangsong("仿宋",14);
ui->label->setFont(fangsong);
ui->label_2->setFont(fangsong);
ui->label_3->setFont(fangsong);
ui->label_4->setFont(fangsong);
ui->label_6->setFont(fangsong);
//指定菜单栏
#ifdef USE_DEFAULT_MENU_BAR
//添加菜单栏(此处添加为的为QMainWindow自带的菜单)
pMenuBar = this->menuBar();
#else
//添加自定义菜单
pMenuBar = new QMenuBar(this);
#endif
//定义菜单项
pMenuTest = new QMenu("功能",this);
//定义子菜单
//(&s)为子菜单快捷键,当打开该菜单项后,按下‘s’键即可响应
pActionTest = new QAction("矩阵相加",this);
//新建一个带图标的菜单项,图标使用资源文件中的资源
pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),"矩阵相减",this);
pActionTest2 = new QAction("矩阵相乘",this);
pActionTest3 = new QAction("矩阵求逆",this);
pActionTest4 = new QAction("矩阵转置",this);
//将菜单项添加到子菜单
pMenuTest->addAction(pActionTest);
pMenuTest->addAction(pActionTest1);
pMenuTest->addAction(pActionTest2);
pMenuTest->addAction(pActionTest3);
pMenuTest->addAction(pActionTest4);
//将子菜单添加到菜单栏
pMenuBar->addMenu(pMenuTest);
#ifndef USE_DEFAULT_MENU_BAR
//当不使用QMainWindow自带的菜单栏时,必须要加上此行
setMenuBar(pMenuBar);
#endif
//添加菜单响应函数
connect(pActionTest,&QAction::triggered,this,&MainWindow::OnActionTest);
connect(pActionTest1,&QAction::triggered,this,&MainWindow::OnActionTest1);
connect(pActionTest2,&QAction::triggered,this,&MainWindow::OnActionTest2);
connect(pActionTest3,&QAction::triggered,this,&MainWindow::OnActionTest3);
connect(pActionTest4,&QAction::triggered,this,&MainWindow::OnActionTest4);
2.矩阵相加
void MainWindow::OnActionTest(){
int jugement_v = 1;
if((ALICE->mu!=BEN->mu)||(ALICE->nu!=BEN->nu)){
QDialog dlg;
dlg.setWindowTitle("不是同类型矩阵,不能进行加法运算");
jugement_v=0;
dlg.exec();
}
COTY->mu=ALICE->mu;
COTY->nu=BEN->nu;
COTY->tu=0;
int a=0,b=0;
while(a<ALICE->tu && b<BEN->tu){//a,b都小于非零元个数时
if(ALICE->data[a].i<BEN->data[b].i){//如果a中数据的行号小于b中数据行号,把A放进C
COTY->tu++;
COTY->data[COTY->tu].i=ALICE->data[a].i;
COTY->data[COTY->tu].j=ALICE->data[a].j;
COTY->data[COTY->tu].v=ALICE->data[a].v;
a++;
}
else if(ALICE->data[a].i==BEN->data[b].i){
//如果a中数据的行号等于b中数据行号,则看列号,把列号小的放入C,若行列都相同,若相加不为0,则相加后放入C
if(ALICE->data[a].j<BEN->data[b].j){
COTY->tu++;
COTY->data[COTY->tu].i=ALICE->data[a].i;
COTY->data[COTY->tu].j=ALICE->data[a].j;
COTY->data[COTY->tu].v=ALICE->data[a].v;
a++;
}
else if(ALICE->data[a].j>BEN->data[b].j){
COTY->tu++;
COTY->data[COTY->tu].i=BEN->data[b].i;
COTY->data[COTY->tu].j=BEN->data[b].j;
COTY->data[COTY->tu].v=BEN->data[b].v;
b++;
}
else{
COTY->tu++;
COTY->data[COTY->tu].i=BEN->data[b].i;
COTY->data[COTY->tu].j=BEN->data[b].j;
COTY->data[COTY->tu].v=BEN->data[b].v+ALICE->data[a].v;
a++;
b++;
}
}
else{//如果a中数据的行号大于b中数据行号,把B放进C
COTY->tu++;
COTY->data[COTY->tu].i=BEN->data[b].i;
COTY->data[COTY->tu].j=BEN->data[b].j;
COTY->data[COTY->tu].v=BEN->data[b].v;
b++;
}
}
//把还有剩余数据的数组的数据放到C中
while(a<=ALICE->tu)
{
COTY->tu++;
COTY->data[COTY->tu].i=ALICE->data[b].i;
COTY->data[COTY->tu].j=ALICE->data[b].j;
COTY->data[COTY->tu].v=ALICE->data[b].v;
a++;
}
while(b<=BEN->tu)
{
COTY->tu++;
COTY->data[COTY->tu].i=BEN->data[b].i;
COTY->data[COTY->tu].j=BEN->data[b].j;
COTY->data[COTY->tu].v=BEN->data[b].v;
b++;
}
if(jugement_v==1){
qDeleteAll(btnlabellist);
btnlabellist.clear();
int num=0;
for(int i_1=0;i_1<COTY->mu;i_1++){
for(int j_1=0;j_1<COTY->nu;j_1++){
for(int q_1=0;q_1<COTY->tu;q_1++){
num++;
btnlabel=new QLabel(this);
btnlabel->setParent(this);
btnlabel->show();
//设置按钮在主对话框的位置
// 每一个的坐标, 横、纵 、宽度、高度
btnlabel->setGeometry(20+(500/COTY->mu)*j_1,20+(500/COTY->mu)*i_1,(500/COTY->mu),(500/COTY->mu));
//设置按钮对象名字
btnlabel->setObjectName("btnlabel"+QString::number(num));//num正序
//设置按钮显示文本
if(COTY->data[q_1].i == i_1+1&&COTY->data[q_1].j == j_1+1 && COTY->data[q_1].v != 0){
btnlabel->setText(QString::number(COTY->data[q_1].v));
}
btnlabel->setStyleSheet("QLabel{border:2px solid rgb(128,128,128);}");
btnlabel ->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
QFont fangsong("仿宋",14);
btnlabel->setFont(fangsong);
//向QList添加成员项
btnlabellist.append(btnlabel);
}
}
}
}
}
3.矩阵相减
void MainWindow::OnActionTest1(){
if((ALICE->mu!=BEN->mu)||(ALICE->nu!=BEN->nu)){
QDialog dlg;
dlg.setWindowTitle("不是同类型矩阵,不能进行减法运算");
dlg.exec();
}
COTY->mu=ALICE->mu;
COTY->nu=BEN->nu;
COTY->tu=0;
int a=0,b=0;
while(a<ALICE->tu && b<BEN->tu){//a,b都小于非零元个数时
if(ALICE->data[a].i<BEN->data[b].i){//如果a中数据的行号小于b中数据行号,把A放进C
COTY->tu++;
COTY->data[COTY->tu].i=ALICE->data[a].i;
COTY->data[COTY->tu].j=ALICE->data[a].j;
COTY->data[COTY->tu].v=ALICE->data[a].v;
a++;
}
else if(ALICE->data[a].i==BEN->data[b].i){
//如果a中数据的行号等于b中数据行号,则看列号,把列号小的放入C,若行列都相同,若ALICE减去BEN不为零则将数据加入COTY
if(ALICE->data[a].j<BEN->data[b].j){
COTY->tu++;
COTY->data[COTY->tu].i=ALICE->data[a].i;
COTY->data[COTY->tu].j=ALICE->data[a].j;
COTY->data[COTY->tu].v=ALICE->data[a].v;
a++;
}
else if(ALICE->data[a].j>BEN->data[b].j){
COTY->tu++;
COTY->data[COTY->tu].i=BEN->data[b].i;
COTY->data[COTY->tu].j=BEN->data[b].j;
COTY->data[COTY->tu].v=0-BEN->data[b].v;
b++;
}
else{
COTY->tu++;
COTY->data[COTY->tu].i=ALICE->data[b].i;
COTY->data[COTY->tu].j=ALICE->data[b].j;
COTY->data[COTY->tu].v=ALICE->data[b].v-BEN->data[a].v;
a++;
b++;
}
}
else{//如果a中数据的行号大于b中数据行号,把B放进C
COTY->tu++;
COTY->data[COTY->tu].i=BEN->data[b].i;
COTY->data[COTY->tu].j=BEN->data[b].j;
COTY->data[COTY->tu].v= 0-BEN->data[b].v;
b++;
}
}
//把还有剩余数据的数组的数据放到C中
while(a<=ALICE->tu)
{
COTY->tu++;
COTY->data[COTY->tu].i=ALICE->data[b].i;
COTY->data[COTY->tu].j=ALICE->data[b].j;
COTY->data[COTY->tu].v=ALICE->data[b].v;
a++;
}
while(b<=BEN->tu)
{
COTY->tu++;
COTY->data[COTY->tu].i=BEN->data[b].i;
COTY->data[COTY->tu].j=BEN->data[b].j;
COTY->data[COTY->tu].v= 0-BEN->data[b].v;
b++;
}
qDeleteAll(btnlabellist);
btnlabellist.clear();
int num=0;
for(int i_1=0;i_1<COTY->mu;i_1++){
for(int j_1=0;j_1<COTY->nu;j_1++){
for(int q_1=0;q_1<COTY->tu;q_1++){
num++;
btnlabel=new QLabel(this);
btnlabel->setParent(this);
btnlabel->show();
//设置按钮在主对话框的位置
// 每一个的坐标, 横、纵 、宽度、高度
btnlabel->setGeometry(20+(500/COTY->mu)*j_1,20+(500/COTY->mu)*i_1,(500/COTY->mu),(500/COTY->mu));
//设置按钮对象名字
btnlabel->setObjectName("btnlabel"+QString::number(num));//num正序
//设置按钮显示文本
if(COTY->data[q_1].i == i_1+1&&COTY->data[q_1].j == j_1+1 && COTY->data[q_1].v != 0){
btnlabel->setText(QString::number(COTY->data[q_1].v));
}
btnlabel->setStyleSheet("QLabel{border:2px solid rgb(128,128,128);}");
btnlabel ->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
QFont fangsong("仿宋",14);
btnlabel->setFont(fangsong);
//向QList添加成员项
btnlabellist.append(btnlabel);
}
}
}
}