Название: глобальные и локальные переменные в qt Отправлено: Uhbif от Май 06, 2021, 20:14 Я новичок, по ссылке http://cs.tealeaf.su/serial-port-gui.html попробовал создать программу для опроса ком-порта. У меня в принципе все получилось, все работает. Теперь немного хочу доработать программу, то есть чтобы таймер не сразу гнал данные в порт, а только после нажатия кнопки, и после нажатия другой соответственно останавливался. Думал сделать это через глобальные переменные. и написал так:
это main.cpp #include "mainwindow.h" #include <QApplication> int i; int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> extern int i; QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT в h файле прописал extern, то есть вроде как объявил глобальную переменную. Дальше файл mainwindow.cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // создали таймер, привязали его к форме // если ругается на QTimer ставим на него курсор и нажимаем Alt+Enter // чтоб на автомате добавить #include <QTimer> QTimer *timer = new QTimer(this); // подключили сигнал timeout, к слоту нажатия на кнопку connect(timer, SIGNAL(timeout()), this, SLOT(on_pushButton_4_clicked())); // запускаем со значением вызывать раз в 300мс if(i >0) { timer->stop(); }else { timer->start(300); } foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) { ui->cmbPort->addItem(serialPortInfo.portName()); } } MainWindow::~MainWindow() { delete ui; } здесь подразумеваю что глобальная переменная 0 и программа каждые 300 мс как бы нажимает кнопку и получает данные это все работает. ниже кнопка. void MainWindow::on_pushButton_4_clicked() //получение данных с датчика { QSerialPort serialPort; serialPort.setPortName(this->ui->cmbPort->currentText()); serialPort.setBaudRate(QSerialPort::Baud9600); if (!serialPort.open(QIODevice::ReadWrite)) { // QMessageBox::warning(this, "Ошибка", "Не удалось подключится к порту"); return; } serialPort.write("e"); serialPort.waitForBytesWritten(); // ВСЕ ЧТО ВЫШЕ ЭТОГО НЕ ТРОГАЕМ QByteArray data; // специальный тип QT для хранения последовательности байтов while (serialPort.waitForReadyRead(10)) { // вместо холостого чтения накапливаем результат в переменную data data.append(serialPort.readAll()); } // добавляем строку с содержимым data в поле txtOutput ui->txtData->append(data); serialPort.close(); } тут все работает, теперь дальше кнопка остановки void MainWindow::on_pushButton_5_clicked() //прекращение получения данных { i++; } как я думал, глобальная переменная становится больше на 1 и таймер в соответствии с условием выше должен остановиться. if(i >0) { timer->stop(); }else { timer->start(300); } Но нет как гнал он данные так и гонит. В чем может быть ошибка? Еще может кто нибудь подсказать как мне очистить окно от полученных данных. То есть по нажатию кнопки? Возможно вопросы мои наивные но я только начинаю в это входить. |