python — открытие текстового файла в textEdit в pyQt

У меня есть файлы Qt для чтения текстового файла в textEdit, нажав кнопку, но когда я преобразую его в .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_())

1

Решение

Ниже приведен порт Python для вашего кода C ++. Я изменил несколько имен переменных, но в остальном он точно такой же. Он должен быть сохранен в том же каталоге, что и 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_())

PS:

Здесь есть одно маленькое любопытство. Когда автоматически соединительные слоты по имени, может быть необходимо использовать pyqtSlot Декоратор различает разные перегрузки сигнала. Эта ситуация также происходит с сигналами (такими как clicked) которые имеют аргументы по умолчанию, потому что PyQt реализует их как отдельные перегрузки (одна отправляет значение по умолчанию, а другая ничего не отправляет). Если декоратор не использовался, и то и другое перегрузки будут соединены, и слот будет вызван дважды.

И последнее замечание: обычно не нужно запускать pyuic с -x или же --execute флаг. Следующего достаточно:

    pyuic4 -o mainwindow.py mainwindow.ui
0

Другие решения

Вы можете сделать это как:

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

Или в вашем коде:

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

Вы также можете найти простой текстовый редактор в PyQt Вот.

1

По вопросам рекламы [email protected]