Files
TuringMachine/centralwidget.cpp
2018-05-07 13:14:10 +08:00

180 lines
5.6 KiB
C++

#include "centralwidget.h"
CentralWidget::CentralWidget(QWidget *parent) : QWidget(parent)
{
machine = new TuringMachine(this);
// nameEdit = new QLineEdit(this);
// nameEdit->setReadOnly(true);
autoCheckTimer = new QTimer(this);
connect(autoCheckTimer, QTimer::timeout, this, [this](){
checkByStep->click();
});
teststrEdit = new QLineEdit(this);
allStatesEdit = new QLineEdit(this);
allStatesEdit->setReadOnly(true);
inputEdit = new QLineEdit(this);
inputEdit->setReadOnly(true);
alphabetEdit = new QLineEdit(this);
alphabetEdit->setReadOnly(true);
initialStateEdit = new QLineEdit(this);
initialStateEdit->setReadOnly(true);
blankEdit = new QLineEdit(this);
blankEdit->setReadOnly(true);
finialStatesEdit = new QLineEdit(this);
finialStatesEdit->setReadOnly(true);
listWidget = new QListWidget(this);
importButton = new QPushButton(tr("导入配置"), this);
connect(importButton, QPushButton::clicked, this, importJson);
checkByStep = new QPushButton(tr("单步检查"), this);
checkByStep->setDisabled(true);
connect(checkByStep, QPushButton::clicked, this, stepCheck);
autoCheckButton = new QPushButton(tr("自动模式"), this);
autoCheckButton->setDisabled(true);
connect(autoCheckButton, QPushButton::clicked, this, autoCheck);
loadButton = new QPushButton(tr("装载纸带"), this);
loadButton->setDisabled(true);
connect(loadButton, QPushButton::clicked, this, loadTape);
resetButton = new QPushButton(tr("重置"), this);
connect(resetButton, QPushButton::clicked, this, [this](){
machine->reset();
loadButton->setEnabled(true);
autoCheckButton->setDisabled(true);
checkByStep->setDisabled(true);
checkByStep->setChecked(false);
});
tape = new PaperTape();
scene = new QGraphicsScene(this);
scene->setSceneRect(-250, -65, 500, 130);
scene->addItem(tape);
scene->addLine(0,0,0,40,QPen(Qt::red));
view = new QGraphicsView(scene ,this);
formlayout = new QFormLayout();
// formlayout->setSpacing(10);
// formlayout->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
// formlayout->addRow(tr("Name"), nameEdit);
formlayout->addRow(tr("状态集合"), allStatesEdit);
formlayout->addRow(tr("输入字符"), inputEdit);
formlayout->addRow(tr("字符表"), alphabetEdit);
formlayout->addRow(tr("初始状态"), initialStateEdit);
formlayout->addRow(tr("空白符"), blankEdit);
formlayout->addRow(tr("终止状态"), finialStatesEdit);
formlayout->addRow(tr("Test string"), teststrEdit);
// formlayout->addRow(loadButton);
// formlayout->addRow(checkByStep);
vsublayout = new QVBoxLayout();
vsublayout->addWidget(importButton);
vsublayout->addWidget(resetButton);
vsublayout->addWidget(loadButton);
vsublayout->addWidget(autoCheckButton);
vsublayout->addWidget(checkByStep);
hlayout = new QHBoxLayout();
hlayout->addLayout(formlayout);
hlayout->addWidget(listWidget);
hlayout->addLayout(vsublayout);
// hlayout->addWidget(importButton);
mainlayout = new QVBoxLayout(this);
mainlayout->addLayout(hlayout);
mainlayout->addWidget(view);
setLayout(mainlayout);
}
CentralWidget::~CentralWidget()
{
delete machine;
delete tape;
}
void CentralWidget::importJson()
{
QString filename = QFileDialog::getOpenFileName(this, tr("import json"),
".",tr("json(*.json)"));
if(filename.isEmpty())
return;
if(!machine->setGrammar(filename))
{
QMessageBox::warning(this, "警告", "请检查文件格式");
setStatus("导入失败");
return;
};
setStatus(tr("导入成功"));
if(machine->hasGrammar())
{
loadButton->setEnabled(true);
// checkByStep->setEnabled(true);
}
else
loadButton->setDisabled(false);
// nameEdit->setText(machine->getName());
allStatesEdit->setText(machine->getAllStates().join(", "));
alphabetEdit->setText(machine->getAlphabet().split("", QString::SkipEmptyParts).join(", "));
inputEdit->setText(machine->getInput().split("", QString::SkipEmptyParts).join(", "));
initialStateEdit->setText(machine->getInitialState());
blankEdit->setText(machine->getBlank());
finialStatesEdit->setText(machine->getFinialStates().join(", "));
listWidget->clear();
listWidget->addItems(machine->getTransition());
if(teststrEdit->text().isEmpty())
{
teststrEdit->setText(machine->getRawStr());
}
tape->adjustPos();
}
void CentralWidget::loadTape()
{
machine->setTestStr(teststrEdit->text());
machine->reset();
tape->setStr(machine->getTestStr());
tape->standBy(1);
checkByStep->setEnabled(true);
autoCheckButton->setEnabled(true);
machineReady = true;
}
void CentralWidget::stepCheck()
{
machineReady = machine->checkByStep();
if(machineReady)
{
loadButton->setDisabled(true);
tape->standBy(machine->getCurrentIndex());
tape->setStr(machine->getTestStr());
listWidget->setCurrentRow(machine->getTransitionIndex());
}
else
{
loadButton->setEnabled(true);
autoCheckButton->setDisabled(true);
checkByStep->setDisabled(true);
checkByStep->setChecked(false);
autoCheckTimer->stop();
if(machine->getFinialStates().contains(machine->getCurrentState()))
{
emit setStatus("Correct!");
}
else
{
emit setStatus("Not OK!");
}
}
}
void CentralWidget::autoCheck()
{
autoCheckTimer->start(300);
}