Помогите, пожалуйста, разобраться в следующей ситуации.
Есть кнопка открытия COM-порта. После того, как COM-порт открыт, название кнопки изменяется с "Open" на "Close"! Ну и соответственно при следующем нажатии надо попадать в слот закрытия порта. Как это сделать корректно?
Вот маленький кусок кода:
/// Класс главного окна программы
class ImitatorTSL: public QMainWindow, public Ui::ImitatorTSLClass
{
Q_OBJECT
private:
bool isPortNumEmpty();
int numberPort();
char* stringPort();
public slots:
void openPort();
void closePort();
};
ImitatorTSL::ImitatorTSL(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
setupUi(this);
connect(btnPortWorking, SIGNAL(clicked()), this, SLOT(openPort()));
connect(btnPortWorking, SIGNAL(clicked()), this, SLOT(closePort()));
}
ImitatorTSL::~ImitatorTSL() {}
/// Проверка edit-поля номера порта на пустоту
bool ImitatorTSL::isPortNumEmpty()
{
if(linePort -> text().isEmpty())
{
QMessageBox message(QMessageBox::Critical, QString("Error"), QString("Number of port must not to empty"),
QMessageBox::Ok, this);
message.exec();
return true;
}
return false;
}
/// Возвращает номер порта (если есть неполадки, то -1)
int ImitatorTSL::numberPort()
{
bool ok;
int port = linePort -> text().toInt(&ok);
if(!ok)
{
QMessageBox message(QMessageBox::Critical, QString("Error"), QString("Number of port isn't correct"),
QMessageBox::Ok, this);
message.exec();
return -1;
}
return port;
}
/// Получение строкового значения порта
char* ImitatorTSL::stringPort()
{
int port = numberPort();
if(port == -1) return "error";
string port_str(QString(QString("COM") + QString::number(port)).toStdString());
char *char_numport = new char[port_str.size() + 1];
memcpy(char_numport, port_str.c_str(), port_str.size());
char_numport[port_str.size()] = 0;
return char_numport;
}
/// Открытие порта COM
void ImitatorTSL::openPort()
{
if(isPortNumEmpty()) return;
char *char_numport = stringPort();
if(!_stricmp(char_numport, "error")) return;
COMPort comPort;
bool init = comPort.init(::CreateFile(char_numport, GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
0, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
0 // hTemplate must be NULL for comm devices
));
if(!init)
{
DWORD error = ::GetLastError();
QMessageBox message(QMessageBox::Critical, QString("Error"), QString("Error number %1").arg(error),
QMessageBox::Ok, this);
message.exec();
return;
}
btnPortWorking -> setText("Close");
}
/// Закрытие COM-порта
void ImitatorTSL::closePort()
{
char *char_numport = stringPort();
if(!_stricmp(char_numport, "error")) return;
}