2.1编写编辑器逻辑代码

VS Code打开我们的工程文件夹:
新建一个文件:editor.py
首先既然要用到GUI,自然是要import包进来:

import sys
import os
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *

from ui_savemain import Ui_MainWindow

同时我们也导入自己制作的UI界面。
ui_savemain正是上一节中我们保存的py文件的名字。
那么怎么调用出来呢。

class SaveEditor(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = SaveEditor()
    main_window.show()
    app.exec()

新建一个类,多重继承QMainWindow,Ui_MainWindow,然后实例化这个类,直接运行我们就能看到窗体了,同时能看到我们自己放的两个按钮。
我这里是后期效果了,前期效果没有存图。先放着吧。

窗体

首先让我们来想想如何实现导入字符串的效果,把字符串输入进去很容易,但是如何把字符串正确处理并且显示图片呢?这就是整个程序第一个核心难点。
虽然鼓励大家独立思考,但是我这里直接说吧。
首先我们知道楼层信息字符串包含很多$$$$$$,那么我们首先要处理掉$,然后每个数字对应一个图块,那么我们只要建立121个(11*11)按钮,把数字放进按钮里面,显示出来,然后点击按钮,可以更改数字,然后修改完了最后再输出按钮上的数字,然后再把分隔符$填充回去就可以了。

但是按钮实在是太丑了,我们有别的东西可以利用吗,可以,就是label,这个控件没有边框,可以显示图片,让我们的界面美观起来,但是label有个重大的缺陷:它本身不能被单击事件响应——或者说当初GUI控件的作者就没设计这个功能,我们曲线救国,让label能够响应单击事件:
这里的代码不要求大家理解,简单说一下就是自定义label的信号槽,让他响应单击事件。

class MyQLabel(QLabel):
    button_clicked_signal = Signal()

    def __init__(self, parent=None):
        super(MyQLabel, self).__init__(parent)
        self.button_clicked_signal.connect(self.change_map)#绑定一个指定函数,这个是后面要做的功能,先放进来

    def mouseReleaseEvent(self, QMouseEvent):
        self.button_clicked_signal.emit()

这样label也准备好了,让我们开始编写逻辑代码。
仔细想一下,程序是不是应该先把121个label放置到窗口里,然后再绘制地图呢?
确实应该是这样,那么首先我们要确定label的坐标,足足有121个,让我们借助range函数和for循环来计算出每个label的坐标。
定位到主类,新建一个函数calculate_xy

    def calculate_xy(self):
        xy_offset = 52  # 定义偏移量,因为label的坐标并不是从(0,0)开始的
        self.xy_list = []#用来存放坐标值
        for i1 in range(11):#循环11次
            for i2 in range(11):#循环11次
                y = i1 * 32#每次循环x和y都将*32
                x = i2 * 32#因为每个label的大小是32*32,为了不重叠,每次要偏移32个像素
                xy = (x + xy_offset, y + xy_offset)#把之前的偏移量加上
                self.xy_list.append(xy)#把坐标结果放到list里面

计算好之后,就应该创建label了,新建一个函数:

    def setup_label(self):
        self.label_list = []  # 用于存放label控件方便查找
        for index in range(121):  # 循环121次
            object_name = "label_" + str(index)  # 设定label的objectName方便我们后期查找
            map_label = MyQLabel(self)  # 实例化Label类,记得用之前继承过的类
            map_label.setObjectName(object_name)  # 设定objectname
            map_label.resize(32, 32)  # 设定label大小
            x = self.xy_list[index][0]
            y = self.xy_list[index][1]
            map_label.move(x, y)  # 设定坐标
            self.label_list.append(map_label)  # 把label放进去

定位到我们的主类,在里面新建一个函数draw_map

    def draw_map(self, floor_str: str): # 传一个参数进去,用于接受楼层信息字符串
        split_floor = floor_str.split("$")  # 处理掉分隔符,取出数字做成list
        split_floor = split_floor[0:121]  # 因为会有一个空元素,对list进行切片,去掉最后一个元素,其实直接删除也可以
        for index, text in enumerate(split_floor):  # 进行迭代,enumerate函数会给每个list元素编号
            label_widget = self.label_list[index]  # 先取到对应编号的label
            image_path = os.path.join("images", text + ".png")  # 提前准备好了对应数字的图片文件
            if os.path.exists(image_path):  # 如果图片存在
                label_widget.setPixmap(QPixmap(image_path))  # 给label填充图片
            else:
                label_widget.setPixmap(
                    QPixmap("images/missing.png")
                )  # 填充一个miss图片进去来提醒我们这个数字图块没有图片
            label_widget.setToolTip(text)  # 同时设置鼠标悬浮时候的提示框文本
            # 把数字放到tooltip里面方便后期存取
            # text变量是每个图块的数字

这样我们绘图部分就处理好了。这样的话下一章我们来搞定输入和输出。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容