在PyQt中用textEdit打开文本文件

1 投票
2 回答
5725 浏览
提问于 2025-04-18 01:09

我有一些Qt的文件,用来通过点击按钮读取文本文件到文本编辑器,但当我把它转换成.py文件时,它就不工作了。我有以下代码:

main.cpp:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MainWindow w;
  w.show();

  return a.exec();
}

mainwindow.ccp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QFile>
#include<QTextStream>
#include<QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
}

MainWindow::~MainWindow()
{
  delete ui;
}

void MainWindow::on_pushButton_clicked()
{
  QFile file("filename.txt");

  if( !file.open( QIODevice::ReadOnly))
      QMessageBox::information(0, "info", file.errorString());

  QTextStream in( &file );

  ui->textEdit->setText(in.readAll());
}

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();

private slots:
  void on_pushButton_clicked();

private:
  Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

我已经转换成的.py文件没有像上面那样正常工作,请给我一些关于下面代码的正确修改建议。

mainwindow.py:

from PyQt4 import QtCore, QtGui

try:
  _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
  _fromUtf8 = lambda s: s

class Ui_MainWindow(object):
  def setupUi(self, MainWindow):
    MainWindow.setObjectName(_fromUtf8("MainWindow"))
    MainWindow.resize(810, 424)
    self.centralWidget = QtGui.QWidget(MainWindow)
    self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
    self.pushButton = QtGui.QPushButton(self.centralWidget)
    self.pushButton.setGeometry(QtCore.QRect(340, 0, 111, 27))
    self.pushButton.setObjectName(_fromUtf8("pushButton"))
    self.scrollArea = QtGui.QScrollArea(self.centralWidget)
    self.scrollArea.setGeometry(QtCore.QRect(10, 30, 791, 331))
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
    self.scrollAreaWidgetContents = QtGui.QWidget()
    self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 787, 327))
    self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
    self.textEdit = QtGui.QTextEdit(self.scrollAreaWidgetContents)
    self.textEdit.setGeometry(QtCore.QRect(0, 0, 791, 331))
    self.textEdit.setObjectName(_fromUtf8("textEdit"))
    self.scrollArea.setWidget(self.scrollAreaWidgetContents)
    MainWindow.setCentralWidget(self.centralWidget)
    self.menuBar = QtGui.QMenuBar(MainWindow)
    self.menuBar.setGeometry(QtCore.QRect(0, 0, 810, 23))
    self.menuBar.setObjectName(_fromUtf8("menuBar"))
    MainWindow.setMenuBar(self.menuBar)
    self.mainToolBar = QtGui.QToolBar(MainWindow)
    self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
    MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
    self.statusBar = QtGui.QStatusBar(MainWindow)
    self.statusBar.setObjectName(_fromUtf8("statusBar"))
    MainWindow.setStatusBar(self.statusBar)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

  def retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
    self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Open Text", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
  import sys
  app = QtGui.QApplication(sys.argv)
  MainWindow = QtGui.QMainWindow()
  ui = Ui_MainWindow()
  ui.setupUi(MainWindow)
  MainWindow.show()
  sys.exit(app.exec_())

2 个回答

1

你可以这样做:

textEdit = QPlainTextEdit()
text=open('file.txt').read()
textEdit.setPlainText(text)

或者在你的代码里:

text=open('file.txt').read()
self.textEdit.setText(text)

你还可以在PyQt中找到一个简单的文本编辑器,点击这里查看。

0

下面是你C++代码的Python版本。我改了一些变量名,但功能上完全一样。这个文件应该和mainwindow.py模块保存在同一个文件夹里。

from PyQt4 import QtCore, QtGui
from mainwindow import Ui_MainWindow

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

    @QtCore.pyqtSlot()
    def on_pushButton_clicked(self):
        file = QtCore.QFile('filename.txt')
        if not file.open(QtCore.QIODevice.ReadOnly):
            QtGui.QMessageBox.information(None, 'info', file.errorString())
        stream = QtCore.QTextStream(file)
        self.ui.textEdit.setText(stream.readAll())

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

补充说明

这里有一个小细节。当我们自动通过名称连接信号和槽时,可能需要使用pyqtSlot这个装饰器来区分不同的信号重载。这种情况也会出现在一些信号(比如clicked)有默认参数的情况下,因为PyQt把这些实现为不同的重载(一个是发送默认值,另一个是不发送任何值)。如果不使用这个装饰器,两个重载都会被连接,这样槽就会被调用两次。

最后一点:通常情况下,不需要使用pyuic-x--execute标志。只用下面的命令就可以了:

    pyuic4 -o mainwindow.py mainwindow.ui

撰写回答