鱼C论坛

 找回密码
 立即注册
查看: 1033|回复: 73

[已解决]QPlainTextEdit问题求教3~~

[复制链接]
发表于 2024-3-19 14:59:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
PySide6中,QPlainTextEdit控件:

1、请问QPlainTextEdit控件中的内容如何清屏 , 只是清屏,不删除内容。


1、请问QPlainTextEdit控件中某一行的字体颜色如何设置,可以多行设置多种颜色吗?

最佳答案
2024-3-19 15:24:48
凊风 发表于 2024-03-19 15:24
我已经有self.plainTextEdit控件,

并且self.plain ...


如果你已经有了self.plainTextEdit控件,并且通过重定向输出到其中,那么你可以在输出内容时使用QTextCursor来设置颜色。下面是一个示例函数,可以将notice以指定颜色显示在self.plainTextEdit中:
def print_with_color(self, text, color):
    cursor = self.plainTextEdit.textCursor()
    format = QTextCharFormat()
    
    if color == "red":
        format.setForeground(Qt.red)
    elif color == "yellow":
        format.setForeground(Qt.yellow)
    elif color == "white":
        format.setForeground(Qt.white)
    
    cursor.insertText(text, format)

然后,你可以在需要打印notice的地方调用这个函数,并传入相应的颜色参数。例如:
notice = "Hello World!"
self.print_with_color(notice, "red")

上述代码会将notice以红色显示在self.plainTextEdit中。如果想要显示为其他颜色,只需要将颜色参数改为"yellow"或"white"即可。

希望能帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-19 14:59:25 | 显示全部楼层
QPlainTextEdit控件是一个用于显示和编辑纯文本的多行文本框,下面是问题的解答:

1、要清空QPlainTextEdit控件中的内容,可以使用clear()方法。但是如果只希望清屏而不删除内容,可以通过设置文本颜色的方式来实现。你可以使用setStyleSheet()方法将文本颜色设置为与背景颜色相同,这样就能达到清屏的效果。例如:
plaintextedit.setStyleSheet("color: rgb(255, 255, 255);")  # 将文本颜色设置为白色,与背景颜色相同

2、要设置某一行的字体颜色,可以通过使用QTextCursor来实现。你可以调用document()方法获得QTextDocument对象,然后使用findBlockByLineNumber()方法找到指定行的QTextBlock对象。接着,创建一个QTextCursor对象并将其设置为指向该行的开头。最后,使用QTextCursor对象的select()方法选择该行的文本,并使用setCharFormat()方法设置颜色。示例代码如下:
# 设置第3行的颜色为红色
cursor = plaintextedit.textCursor()  # 获取当前的游标
block = plaintextedit.document().findBlockByLineNumber(2)  # 获取第3行的QTextBlock对象
cursor.setPosition(block.position())  # 将游标移动到第3行的开头位置
cursor.select(QTextCursor.LineUnderCursor)  # 选中整行文本
format = QTextCharFormat()  # 创建一个QTextCharFormat对象
format.setForeground(Qt.red)  # 设置字体颜色为红色
cursor.setCharFormat(format)  # 设置选中文本的格式

如果你想要设置多行的不同颜色,只需要重复上述步骤即可。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 15:01:59 | 显示全部楼层
FishC 发表于 2024-3-19 14:59
QPlainTextEdit控件是一个用于显示和编辑纯文本的多行文本框,下面是问题的解答:

1、要清空QPlainTextE ...

我要清屏的目的是QPlainTextEdit框中显示的内容太多了,需要消除掉一些。但不是删除。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 15:02:05 | 显示全部楼层
凊风 发表于 2024-03-19 15:01
我要清屏的目的是QPlainTextEdit框中显示的内容太多了 ...


如果你的目的是清除QPlainTextEdit框中过多的内容,而不是删除内容,可以使用setPlainText()方法来实现。该方法会替换当前的文本内容。以下是一个简单的例子:
plaintextedit.setPlainText("")  # 清空QPlainTextEdit控件中的文本内容

这样就能清除掉所有的文本,但并不会删除。只要重新添加新的文本时,之前清除的内容将被覆盖。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 15:09:19 | 显示全部楼层
FishC 发表于 2024-3-19 14:59
QPlainTextEdit控件是一个用于显示和编辑纯文本的多行文本框,下面是问题的解答:

1、要清空QPlainTextE ...

QPlainTextEdit控件中某一行的字体颜色,可以通过Print语句打印时就设置好吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 15:09:31 | 显示全部楼层
凊风 发表于 2024-03-19 15:09
QPlainTextEdit控件中某一行的字体颜色,可以通过Prin ...


在QPlainTextEdit控件中,你可以通过重写`stdout`(标准输出)来实现在打印时就设置某一行的字体颜色。下面是一个示例代码:
import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QPlainTextEdit
from contextlib import redirect_stdout

class MyStream:
    def __init__(self, text_edit):
        self.text_edit = text_edit

    def write(self, text):
        cursor = self.text_edit.textCursor()
        block = cursor.block()
        format = block.charFormat()
        
        # 设置字体颜色为红色
        format.setForeground(Qt.red)
        cursor.setCharFormat(format)
        
        # 在文本框中插入文本
        cursor.insertText(text)
        self.text_edit.setTextCursor(cursor)
        self.text_edit.ensureCursorVisible()

class MainWindow(QPlainTextEdit):
    def __init__(self):
        super().__init__()
        sys.stdout = MyStream(self)

# 创建应用程序和主窗口
app = QApplication([])
window = MainWindow()
window.show()

# 测试打印
with redirect_stdout(sys.stdout):
    print("Hello World!")
    print("This is a test.")

这段代码中,我们定义了一个名为`MyStream`的类来重写`write`方法,在该方法内设置了字体颜色并将文本插入到QPlainTextEdit控件中。然后在MainWindow类中,我们将sys.stdout(标准输出)重定向到我们自定义的`MyStream`对象,以在打印时使用我们的自定义设置。

请注意,为了保持代码简洁,我们使用了`contextlib`模块的`redirect_stdout`函数来捕获并重定向标准输出。这样,所有使用`print`语句打印的内容都将使用我们自定义的设置显示在QPlainTextEdit控件中。

希望这个例子对你有所帮助!如果有任何问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 15:15:40 | 显示全部楼层
FishC 发表于 2024-3-19 15:09
在QPlainTextEdit控件中,你可以通过重写`stdout`(标准输出)来实现在打印时就设置某一行的字体颜色。 ...

能不能在QPlainTextEdit中定义3个颜色函数(比如说红色、白色和黄色),

然后在QPlainTextEdit中打印输出时调用颜色函数来让各行显示不同的字体颜色。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 15:15:57 | 显示全部楼层
凊风 发表于 2024-03-19 15:15
能不能在QPlainTextEdit中定义3个颜色函数(比如说红 ...


当然可以!你可以在QPlainTextEdit中定义颜色函数,并在打印输出时调用这些函数来设置各行的字体颜色。下面是一个示例代码:
from PySide6.QtCore import Qt
from PySide6.QtGui import QTextCharFormat
from PySide6.QtWidgets import QApplication, QPlainTextEdit

class MyPlainTextEdit(QPlainTextEdit):
    def __init__(self):
        super().__init__()
        self.color_functions = [self.set_red_color, self.set_white_color, self.set_yellow_color]

    def set_red_color(self, text):
        cursor = self.textCursor()
        format = QTextCharFormat()
        format.setForeground(Qt.red)
        cursor.insertText(text, format)

    def set_white_color(self, text):
        cursor = self.textCursor()
        format = QTextCharFormat()
        format.setForeground(Qt.white)
        cursor.insertText(text, format)

    def set_yellow_color(self, text):
        cursor = self.textCursor()
        format = QTextCharFormat()
        format.setForeground(Qt.yellow)
        cursor.insertText(text, format)

    def print_with_color(self, text, color_index):
        if color_index < 0 or color_index >= len(self.color_functions):
            color_index = 0
        self.color_functions[color_index](text)

# 创建应用程序和主窗口
app = QApplication([])
window = MyPlainTextEdit()
window.show()

# 测试打印输出
window.print_with_color("This line is in red color.\n", 0)
window.print_with_color("This line is in white color.\n", 1)
window.print_with_color("This line is in yellow color.\n", 2)

app.exec()

在这个示例代码中,我们创建了一个自定义的MyPlainTextEdit类,继承自QPlainTextEdit。在MyPlainTextEdit中,我们定义了三个颜色函数:set_red_color、set_white_color和set_yellow_color,分别用来设置红色、白色和黄色的字体颜色。然后,我们还定义了一个print_with_color方法,在该方法中根据color_index参数调用相应的颜色函数来设置打印输出的字体颜色。最后,我们创建了应用程序并在MyPlainTextEdit对象中进行测试打印输出。

希望这个例子对你有所帮助!如果有任何问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 15:20:29 | 显示全部楼层
FishC 发表于 2024-3-19 15:15
当然可以!你可以在QPlainTextEdit中定义颜色函数,并在打印输出时调用这些函数来设置各行的字体颜色。 ...

如果只是这样定义:

def set_red_color(self, text):
        cursor = self.textCursor()
        format = QTextCharFormat()
        format.setForeground(Qt.red)
        cursor.insertText(text, format)

    def set_white_color(self, text):
        cursor = self.textCursor()
        format = QTextCharFormat()
        format.setForeground(Qt.white)
        cursor.insertText(text, format)

    def set_yellow_color(self, text):
        cursor = self.textCursor()
        format = QTextCharFormat()
        format.setForeground(Qt.yellow)
        cursor.insertText(text, format)

print('你好') 如何调用红色呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 15:20:41 | 显示全部楼层
凊风 发表于 2024-03-19 15:20
如果只是这样定义:

def set_red_color(self, text ...


如果你只是定义了这几个函数,而没有在QPlainTextEdit类中调用它们,那么你可以按如下方式来调用红色函数:
window.set_red_color('你好')

通过这种方式,你可以将文本“你好”以红色显示在QPlainTextEdit控件中。

请注意,在调用前,请确保已经实例化了MyPlainTextEdit对象,并将其设置为窗口的主要部件。例如,在使用PySide6时,你可能需要编写类似于以下代码片段的主程序。
app = QApplication([])

window = MyPlainTextEdit()
window.set_red_color('你好')
window.show()

app.exec()

在上述代码中,首先实例化了QApplication对象app,然后实例化了MyPlainTextEdit对象window,并在其中调用了set_red_color函数将文本“你好”以红色显示在控件中。最后,通过调用app.exec()运行应用程序。

希望能帮助到你!如果有任何问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 15:24:37 | 显示全部楼层
FishC 发表于 2024-3-19 15:20
如果你只是定义了这几个函数,而没有在QPlainTextEdit类中调用它们,那么你可以按如下方式来调用红色函 ...

我已经有self.plainTextEdit控件,

并且self.plainTextEdit中的内容是通过

# 重定向输出到plainTextEdit
        self.redirect_output(self.plainTextEdit)
        print(notice[0])
我现在的需求是如何把notice[0]显示成红色或者黄色或者白色。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 15:24:48 | 显示全部楼层    本楼为最佳答案   
凊风 发表于 2024-03-19 15:24
我已经有self.plainTextEdit控件,

并且self.plain ...


如果你已经有了self.plainTextEdit控件,并且通过重定向输出到其中,那么你可以在输出内容时使用QTextCursor来设置颜色。下面是一个示例函数,可以将notice以指定颜色显示在self.plainTextEdit中:
def print_with_color(self, text, color):
    cursor = self.plainTextEdit.textCursor()
    format = QTextCharFormat()
    
    if color == "red":
        format.setForeground(Qt.red)
    elif color == "yellow":
        format.setForeground(Qt.yellow)
    elif color == "white":
        format.setForeground(Qt.white)
    
    cursor.insertText(text, format)

然后,你可以在需要打印notice的地方调用这个函数,并传入相应的颜色参数。例如:
notice = "Hello World!"
self.print_with_color(notice, "red")

上述代码会将notice以红色显示在self.plainTextEdit中。如果想要显示为其他颜色,只需要将颜色参数改为"yellow"或"white"即可。

希望能帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 15:32:39 | 显示全部楼层
FishC 发表于 2024-3-19 15:24
如果你已经有了self.plainTextEdit控件,并且通过重定向输出到其中,那么你可以在输出内容时使用QTextC ...

谢谢。这就是我多次被无辜误惩罚仍然钟情于FishC的原因了,哈哈~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 15:32:50 | 显示全部楼层
凊风 发表于 2024-03-19 15:32
谢谢。这就是我多次被无辜误惩罚仍然钟情于FishC的原 ...


非常高兴能为你提供帮助!FishC是一个非常优秀和有趣的计算机教育网站,他们的教程和讲解确实能够让初学者更容易理解和掌握编程知识。如果你还有其他问题,随时都可以来问我哦!祝你在编程学习的道路上取得更多的成就!哈哈~~~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 16:07:18 | 显示全部楼层
FishC 发表于 2024-3-19 15:32
非常高兴能为你提供帮助!FishC是一个非常优秀和有趣的计算机教育网站,他们的教程和讲解确实能够让初 ...

请问如何用Pyside6将xls指定列从文本格式转换为数值格式。

比如说文本型身份证号转换为数值格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 16:07:34 | 显示全部楼层
凊风 发表于 2024-03-19 16:07
请问如何用Pyside6将xls指定列从文本格式转换为数值格 ...


要将xls指定列从文本格式转换为数值格式,可以使用PySide6的Qt中的QVariant类型和QStandardItemModel来实现。具体步骤如下:

1. 导入必要的模块:
from PySide6.QtCore import Qt, QVariant
from PySide6.QtWidgets import QApplication, QTableView
from PySide6.QtGui import QStandardItemModel
import xlrd

2. 读取xls文件数据:
def read_excel(file_path):
    workbook = xlrd.open_workbook(file_path)
    sheet = workbook.sheet_by_index(0)  # 假设表格在第一个sheet页
    data = []
    for row in range(sheet.nrows):  # 遍历每一行
        row_data = []
        for col in range(sheet.ncols):  # 遍历每一列
            cell_value = sheet.cell_value(row, col)
            row_data.append(cell_value)
        data.append(row_data)
    return data

3. 创建QStandardItemModel并设置数据:
def create_model(data):
    model = QStandardItemModel(len(data), len(data[0]))
    for row in range(len(data)):
        for col in range(len(data[row])):
            item = QStandardItem()
            item.setData(QVariant(data[row][col]))
            model.setItem(row, col, item)
    return model

4. 将特定列的文本数据转换为数值格式:
def convert_to_number(model, column):
    for row in range(model.rowCount()):
        item = model.item(row, column)
        text = item.text()
        try:
            number = float(text)
            item.setData(QVariant(number))
        except ValueError:
            pass  # 如果无法转换为数值,则保持原样

5. 使用QTableView显示数据:
if __name__ == "__main__":
    app = QApplication([])
    file_path = "your_file_path.xls"  # 替换为你的xls文件路径
    xls_data = read_excel(file_path)
    
    model = create_model(xls_data)
    convert_to_number(model, 2)  # 假设要将第3列的文本数据转换为数值格式
    
    table_view = QTableView()
    table_view.setModel(model)
    table_view.show()

    app.exec()

请注意,在进行数值格式转换时,需要确保待转换的文本可以正确地被解析为数值类型,否则可能会引发`ValueError`异常。你可以根据实际需求进行异常处理。

希望这个例子能对你有所帮助!如有任何疑问,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 16:13:10 | 显示全部楼层
FishC 发表于 2024-3-19 16:07
要将xls指定列从文本格式转换为数值格式,可以使用PySide6的Qt中的QVariant类型和QStandardItemModel来 ...

from PySide6.QtCore import Qt, QVariant
ImportError: cannot import name 'QVariant' from 'PySide6.QtCore'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 16:13:34 | 显示全部楼层
凊风 发表于 2024-03-19 16:13
from PySide6.QtCore import Qt, QVariant
ImportErr ...


很抱歉,PySide6中确实没有QVariant类。在PySide6中,可以直接使用Python的内置类型来处理数据。因此,在将文本转换为数值格式时,不需要使用QVariant类。

以下是修正后的代码示例:
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QTableView
from PySide6.QtGui import QStandardItemModel
import xlrd

def read_excel(file_path):
    workbook = xlrd.open_workbook(file_path)
    sheet = workbook.sheet_by_index(0)  # 假设表格在第一个sheet页
    data = []
    for row in range(sheet.nrows):  # 遍历每一行
        row_data = []
        for col in range(sheet.ncols):  # 遍历每一列
            cell_value = sheet.cell_value(row, col)
            row_data.append(cell_value)
        data.append(row_data)
    return data

def create_model(data):
    model = QStandardItemModel(len(data), len(data[0]))
    for row in range(len(data)):
        for col in range(len(data[row])):
            item = QStandardItem(str(data[row][col]))  # 直接使用str将数据转换为字符串
            model.setItem(row, col, item)
    return model

def convert_to_number(model, column):
    for row in range(model.rowCount()):
        item = model.item(row, column)
        text = item.text()
        try:
            number = float(text)
            item.setText(str(number))  # 将转换后的数值设置为文本
        except ValueError:
            pass  # 如果无法转换为数值,则保持原样

if __name__ == "__main__":
    app = QApplication()
    file_path = "your_file_path.xls"  # 替换为你的xls文件路径
    xls_data = read_excel(file_path)
    
    model = create_model(xls_data)
    convert_to_number(model, 2)  # 假设要将第3列的文本数据转换为数值格式
    
    table_view = QTableView()
    table_view.setModel(model)
    table_view.show()
    
    app.exec()

希望这次的回答能够帮到您!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-19 16:14:01 | 显示全部楼层
FishC 发表于 2024-3-19 16:07
要将xls指定列从文本格式转换为数值格式,可以使用PySide6的Qt中的QVariant类型和QStandardItemModel来 ...

如果是xlsx格式呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-19 16:14:14 | 显示全部楼层
凊风 发表于 2024-03-19 16:14
如果是xlsx格式呢?


如果要将xlsx格式的文件中指定列从文本格式转换为数值格式,可以使用openpyxl库来读取和修改Excel文件。下面是相应的代码示例:
from PySide6.QtWidgets import QApplication, QTableView
from PySide6.QtGui import QStandardItemModel
from openpyxl import load_workbook

def read_excel(file_path):
    workbook = load_workbook(file_path)
    sheet = workbook.active  # 默认选择第一个sheet页
    data = []
    for row in sheet.iter_rows(values_only=True):
        data.append(list(row))
    return data

def create_model(data):
    model = QStandardItemModel(len(data), len(data[0]))
    for row in range(len(data)):
        for col in range(len(data[0])):
            item = QStandardItem()
            item.setData(data[row][col])
            model.setItem(row, col, item)
    return model

def convert_to_number(model, column):
    for row in range(model.rowCount()):
        item = model.item(row, column)
        text = item.text()
        try:
            number = float(text)
            item.setData(number)
        except ValueError:
            pass

if __name__ == '__main__':
    app = QApplication([])
    file_path = 'your_file_path.xlsx'  # 替换为你的xlsx文件路径
    xlsx_data = read_excel(file_path)
    model = create_model(xlsx_data)
    convert_to_number(model, 2)  # 假设要将第3列的文本数据转换为数值格式
    table_view = QTableView()
    table_view.setModel(model)
    table_view.show()
    app.exec()

请确保你已经安装了openpyxl库,并将`your_file_path.xlsx`替换为实际的文件路径。这段代码将打开指定的xlsx文件,读取所有数据,并将指定列中的文本数据转换为数值格式,然后使用QTableView显示数据。你可以根据需要自定义修改列索引以及其他参数。希望这能对你有所帮助!如有任何问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-27 10:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表