LINUX.ORG.RU

Передача параметров QLineEdit одного окна в вызываемое окно

 , , ,


0

1

Щупаю этот ваш PyQt и весьма радуюсь, а также постоянно сталкиваюсь с проблемами. Я застопорился на элементарном. Структура приложения: главное окно (QWidget) в котором есть кнопочка выбрать файл. После того как файл выбран, то полное имя файла помещается в QLineEdit. Выбранный файл должен открываться в новом окне. Проблема в том, что я не могу передать значение.

Код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *


class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("Title")
        self.setWindowIcon(QIcon('icon.png'))
        self.setGeometry(500, 300, 600, 100)

        boxlay = QHBoxLayout(self)
        frame = QFrame(self)
        frame.setFrameShape(QFrame.StyledPanel)
        frame.setFrameShadow(QFrame.Raised)

        gridlay = QGridLayout(frame)

        self.open_button = QPushButton("Select file", frame)
        self.compile_button = QPushButton("Compile", frame)
        self.clear_button = QPushButton("Clear", frame)
        self.show_scenario = QPushButton("View file", frame)
        self.scenario_line = QLineEdit(frame)

        self.dialogWindow = OpenScenario()

        self.output_compiler = QPlainTextEdit(frame)
        self.output_compiler.setFixedSize(1280, 400)

        gridlay.addWidget(self.open_button, 0, 1)
        gridlay.addWidget(self.compile_button, 0, 2)
        gridlay.addWidget(self.clear_button, 0, 3)
        gridlay.addWidget(self.show_scenario, 0, 4)
        gridlay.addWidget(self.scenario_line, 4, 0, 1, 5)
        gridlay.addWidget(self.output_compiler, 5, 0, 1, 5)

        self.clear_button.setEnabled(False)
        self.compile_button.setEnabled(False)
        self.output_compiler.setEnabled(False)
        # self.show_scenario.setEnabled(False)

        boxlay.addWidget(frame)

        self.open_button.clicked.connect(self.dialog)
        self.clear_button.clicked.connect(self.clear_test_field)
        self.scenario_line.textChanged.connect(self.enable_buttons)
        self.show_scenario.clicked.connect(self.on_pushButton_clicked)

    @pyqtSlot()
    def on_pushButton_clicked(self):
        self.dialogWindow.exec_()

    def dialog(self):
        scenario = QFileDialog.getOpenFileName(
            self,
            "Select file",
            "/home/amazpyel",
            "XML (*.xml)"
        )
        if scenario:
            self.scenario_line.setText(scenario)
            self.compile_button.setEnabled(True)
            self.clear_button.setEnabled(True)
            self.compile_button.clicked.connect(lambda: self.compile_file(scenario))

    def compile_file(self, test):
        print test
        self.output_compiler.setEnabled(True)
        scenario = str(test)
        os.system(
            "/home/amazpyel/example" + "-c" + scenario +  ">" + scenario + ".log")
        self.output_log(test + ".log")

    def clear_test_field(self):
        self.scenario_line.clear()
        self.output_compiler.clear()
        self.compile_button.setEnabled(False)
        self.clear_button.setEnabled(False)
        self.output_compiler.setEnabled(False)

    def enable_buttons(self):
        self.clear_button.setEnabled(True)
        self.compile_button.setEnabled(True)

    def output_log(self, file):
        text = open(file).read()
        self.output_compiler.setPlainText(text)


class OpenScenario(QDialog):
    def __init__(self):
        super(OpenScenario, self).__init__()

        self.setGeometry(500, 300, 1280, 800)
        self.setFixedSize(self.size())
        self.setWindowTitle("/home/amazpyel/file.xml")

        boxlay_child = QHBoxLayout(self)
        frame_child = QFrame(self)
        frame_child.setFrameShape(QFrame.StyledPanel)
        frame_child.setFrameShadow(QFrame.Raised)

        gridlay_child = QGridLayout(frame_child)

        self.scenario_view = QPlainTextEdit(frame_child)
        self.scenario_view.setFixedSize(1280, 800)
        gridlay_child.addWidget(self.scenario_view, 0, 1)

        self.verticalLayout = QVBoxLayout(self)
        self.verticalLayout.addWidget(self.scenario_view)
        boxlay_child.addWidget(frame_child)

        sce = "/home/amazpyel/files.xml"
        def open_scenario(self, sce):
            scenario_output = open(sce).read()
            self.scenario_view.setPlainText(scenario_output)

        open_scenario(self, sce)


app = QApplication(sys.argv)
sc = MainWindow()
sc.show()
sc.setFixedSize(sc.size())

sys.exit(app.exec_())

Я хотел передать в класс OpenScenario значение scenario_line из класса MainWindow и не вышло.

Создание экземпляра:

self.dialogWindow = OpenScenario()

Открытие окошка по нажатию на кнопку show_scenario (View File):

self.show_scenario.clicked.connect(self.on_pushButton_clicked)
@pyqtSlot()
def on_pushButton_clicked(self):
   self.dialogWindow.exec_()

★★★

Последнее исправление: amazpyel (всего исправлений: 4)

Вообще не понимаю, в чем твоя проблема. Я, правда, не совсем в курсе, как в питоне можно, но в Qt/C++ можно использовать такие варианты:

1. Параметр конструктора класса OpenScenario, в который передаешь имя файла.

2. Метод класса OpenScenario, в параметре которого передаешь имя файла.

3. Метод класса OpenScenario, как в п.2, но который является слотом и из MainWindow сигналом передаешь имя файла.

Какой вариант удобнее, тот и выбирай.

grondek
()
Ответ на: комментарий от amazpyel

Единственное, в Qt приянто, что parentWidget идет последним параметром конструктора.

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.