解决Qt5当中TableView与TableWidget数据互动更新与读取问题

最近,为解决PyQt5的TableView和TableWidget数据互动,一直在找办法。

最后,通过Index方法得到解决。

主要原理为:TableView无法使用Index必须用Model内的index,然后通过循环将二维数组,放入矩阵当中。

但TableWidget作为TableView的子程序更加丰富,TableWidget有item的查找工能。TableWidget.item(i,j).data()即能实现数据提取。但TableWidget.model().index(i,j).data()同样能实现数据提取功能。

数据放入功能很简单,更新model即可。在此不作更深入的讨论。model.setItem(i,j,your_data)

解决公式内的数据进行正确判断的问题,初次使用Try

界面参数已经通过model.record(i).value(j)通过循环枚举取得。

# 清空标准数据重新写入计算参数函数:
def clear_x_add(self):
    self.zj_parameter.clear()  # 清空列表
    self.list_x = []
    # 将model的数据拿出来至list_data
    row_n = table_model.rowCount()
    column_n = table_model.columnCount()
    list_data = pd.DataFrame(index=range(row_n), columns=range(column_n))
    for i in range(row_n):
        for j in range(column_n):
            list_data.loc[i, j] = table_model.record(i).value(j)
    get_x_list = list_data[list_data.columns[4:6]]  # 我只需要4,5列
    print(get_x_list)

    # 用正则表达式找出自己需要参数,当然先要import re
    get_x_compile = re.compile("[a-z]\'|[a-z]|[A-Z]")
    for n in get_x_list[4] + get_x_list[5]:  # python福利:列表相加
        add_item = re.findall(get_x_compile, n)
        for m in add_item:
            if m not in self.list_x:  # python福利:有不同元素就放入
                self.list_x.append(m)
                self.zj_parameter.appendPlainText(m + '=')  # 顺便将数据写入列表
            if 'H' not in self.list_x:
                self.zj_parameter.appendPlainText('H')
    print(self.list_x)

对文本框写入的公式需要进行=号前后数据判断:

>>> a
'33'
>>> b
33.33
>>> 
>>> 
>>> 
>>> def check_a(x):
...     try:
...             if x.isdigit() is True:
...                     print('True')
...             else:
...                     print('False')
...     except:
...             print('Data Wrong',type(x))
... 
>>> 
>>> 
>>> 
>>> check_a(a)
True
>>> a.isdigit()
True
>>> 
>>> 
>>> check_a(b)
Data Wrong <class 'float'>
>>> 
>>> 
>>> 
>>> 
>>> check_a(c)
False
>>> c
'this is string'

以上为自己写的Try也是将测试进行一个初步开始。

解决了Qt表格内数据读取,并用正则表达式提取想要的“参数”

近期开发有点慢,主要是坚持弱了一点点。虽然近期解决了技术上很多功能问题,但发现一个软件的开发工作量真的太大太大。尽管用Python已大大简化了开发难度,但专业的软件需要考虑的东西真的很多,而且专业要求的功能只得一步一步的来。

在此给专业写库(轮子)的高手至以高度崇敬,这也说明自己的东西已经向专业级进发……哪怕是专业计算专业的人员写行业软件,技术到了行业不了解也白搭;其次行业人员,代码不会写,也白搭。软便双修之士,注定是孤独的。

代码越写越多,越复杂,越难以维护;如何提高效率成了一大问题。

近期要实现的功能为:提取表格对应的mode内的数据,再将数据内的计算式字母参数提取出来,写入到一个写字板zj_parameter对像内。

# 查找标准数据当中的计算参数函数:
def find_x(self):
    self.zj_parameter.clear()#清空列表

#将model的数据拿出来至list_data
    row_n = table_model.rowCount()
    column_n = table_model.columnCount()
    list_data = pd.DataFrame(index=range(row_n), columns=range(column_n))
    for i in range(row_n):
        for j in range(column_n):
            list_data.loc[i, j] = table_model.record(i).value(j)
    get_x_list = list_data[list_data.columns[4:6]]#我只需要4,5列
    print(get_x_list)

#用正则表达式找出自己需要参数,当然先要import re
    list_x = []
    get_x_compile = re.compile("[a-z]\'|[a-z]|[A-Z]")
    for n in get_x_list[4] + get_x_list[5]:#python福利:列表相加
        add_item = re.findall(get_x_compile, n)
        for m in add_item:
            if m not in list_x:#python福利:有不同元素就放入
                list_x.append(m)
                self.zj_parameter.appendPlainText(m)#顺便将数据写入列表
    print(list_x)

功能非常顺利与成功。

QT5搞定跨区域对像访问

在主界面内,部分控件在其它控件与函数的(跨区域)访问,一般是由于对像不在self当中引起的。

所以只要将该控件重新定义一次即可:

self.list_1=list_1

接下来,在其它函数当中,调用self.list_1都能找到它

关于model的更新

最近由于model的更新,一直卡住了很多天。最后解决办法是:model.fetchMore()

所有程序语言,参数都没有错。

所有程序拆分运行,也都正常。

实在没有办法,一段代码一段代码的注解,后运行。

最终才找到由于model.fechMore()的一个model.select()无法运行,导致的问题是由于其它表格数据加载没有拉到底部的原因。

这个经验,bug的棑查主要是轮子问题。

所以,加油吧,少年。

Qt5标准模块的调用非常方便

一开始,自己做界面的时候,往往不看手册。

Qt5自己就提供很多很好的标准控件:

1、文件输入控件;

2、颜色输入控件;

3、对话框输入控件;

十分容易有用,最重要的是学习完一个后面都差不多一样的调用,很方便。

算法的理解(排序与递归)

程序的使用,最多的还是理解要解决问题的方法。而解决问题的方法,即是算法。

认真理解和学会算法,是最有用的科学。

1、冒泡排序法:a=[11,29,30,44,56,20]

for i in range(len(a)):
… for j in range(len(a)-1-i):
… if a[j]>a[j+1]:
… a[j],a[j+1]=a[j+1],a[j]
… print(a)

[11, 29, 30, 44, 20, 56]
[11, 29, 30, 20, 44, 56]
[11, 29, 20, 30, 44, 56]
[11, 20, 29, 30, 44, 56]

2、递归:当需要解决一个复杂问题,能够将这个问题拆分成若干子问题,函数自己调用自己(子问题),直到条件出口,执行完成。

  • >>> def fox(n):
  • …     if n==1:
  • …             return 1
  • …     else:
  • …             print(n)
  • …             return n+fox(n-1)
  • … 
  • >>> fox(100)
  • 100
  • 99
  • 98
  • 97
  • ……
  • 5050

最典型的是斐波拉切数列:

  • >>> def fibonacci(n):
  • …     if n==1:
  • …             return 1
  • …     elif n==2:
  • …             return 2
  • …     else:
  • …             return fibonacci(n-1)+fibonacci(n-2)
  • … 
  • >>> fibonacci(10)
  • 89
  • >>> fibonacci(3)
  • 3
  • >>> fibonacci(4)
  • 5
  • >>> fibonacci(5)
  • 8

最典型的游戏:汉诺塔游戏

我估计我又要在算法的领域里折腾一段时间了……数学强+算法强,注定软件非常强的。

作为研究方向,有机会就写一本工程领域常用到的算法书。

GUI的数据库连接出现已连接情况解决

QSqlDatabase db;
if(QSqlDatabase::contains(“qt_sql_default_connection”))
db = QSqlDatabase::database(“qt_sql_default_connection”);
else
db = QSqlDatabase::addDatabase(“QSQLITE”)
原文出处链接及本声明。
原文链接:https://blog.csdn.net/simmerlee/article/details/37872793/

下一步解决:pandas 与Sqlite如何实现数据互导的方法

GUI进展:成功让Dock停靠、弹簧布局问题完美解决

近期一点一点的学习完成了GUI悬停的Dock窗口,弹簧布局问题。这个两个小功能,让软件layout布局形像有了比较大的提升。就是这么清秀,GoGo加油!

最终GUI要毕业,还差QTreeView与数据库或都二维表如何无缝对接了。

其次,QTreeView的托拽操作也是需要攻关的对像。

加油吧~~~胜利就在眼前。