Просмотр сообщений
|
Страниц: 1 [2] 3
|
17
|
Qt / Вопросы новичков / Вывод сообщения в графический интерфейс из другого файла.
|
: Май 25, 2020, 14:25
|
Так, я писал код в рабочую программу, но потом понял, что не получается это сделать. Создал специальный примерочный код. В нём тоже не получается. Компилятор естественно не показывает ошибок. Даже, если вместо переменной, я вставлю сразу тупо любой текст, он тоже не выведется, но, если дополнить код, отладочным сообщением(cout<<"я работаю"; ), то оно выведется и сразу после ui и после. То есть метод работает и вызывается, но не работает сам вызов setText'а. .cpp - файл, который хочет вызвать метод, который выведет посланную переменную в интерфейс. void one(){ int i=0; MainWindow vivod; vivod.vivod_na_ekran(i); } Тут, для проверки. я просто в ручную подставлял цифорки в i=... Но чтобы я туда не вёл, это не выведется. Ну то есть сам ui не работает. mainwindow.cpp - тот самый метод void MainWindow::vivod_na_ekran(int i){ ui->label_2->setText(QString::number(i)); } Метод я сделал публичным. public slots:
void vivod_na_ekran(int i); Я делал его и обычным методом, без слотов и в слотах. Хотя на самом деле пытался и через публичную ui(по одной из подсказок, это называлось ленивым способом), но происходило тоже самое.
|
|
|
20
|
Qt / Вопросы новичков / Как делать неактивные кнопки?
|
: Май 22, 2020, 17:19
|
Гуглил как это сделать, максимум что нашёл, это как делать динамические кнопки. Это вроде как то что нужно, но в тамошнем примере создавались кнопки которые будут создавать другие кнопки.
Мне же надо, пока одна кнопка не нажата, две другие были неактивны. Главное чтобы они не удалялись.
|
|
|
21
|
Qt / Вопросы новичков / Re: Пауза
|
: Май 21, 2020, 23:45
|
>То есть файлом, можно игнорировать такую вещь, как потоки и передавать послания в любые другие потоки или основной
Угу. А про кеширование файловой системы ты не слышал? Обрабатываешь ситуацию, если файл пустой? А если двое сразу запишут в него что-нибудь?
Это просто пример паузы. Переписывать файл могут только пауза и продолжить(просто в этом примере они активны одновременно, что ошибка). На счёт игнорирования, я имел ввиду, что можно организовать общение потоков через файловую систему. Да, тут нету обработок на случай если файл пустой, просто я в маинвиндовс, сразу создаю файл заполненным. Другое дело. если кто то целенаправленно захочет удалить или переписать файл(ну а это ровно тоже самое, если переписать любой файл программы).
|
|
|
23
|
Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
|
: Май 21, 2020, 23:10
|
К сожалению код топикстартера не проверял... Но мне показалось не очень корректным, что он создал кучу коннектов, а если "куча полей" пополнится еще парочкой, то придется писать дополнительные коннекты... Вот и привел пример, исключающий эту проблему. На истину в последней инстанции не претендую Да, эта куча полей действительно пополнится новыми полями и как бы коннекты не так страшно было делать(просто копирование/вставка)+ они находятся в одном месте из-за чего их легко редактировать. Просто суть была в том, чтобы избежать создания однотипных методов с одним и тем же действием, вот я и решил свести их до одного метода.
|
|
|
24
|
Qt / Вопросы новичков / Re: Пауза
|
: Май 21, 2020, 23:01
|
Если кому нужно, я приложу своё решение проблемы с паузой. Однако, тут я всё ещё не знаю, как реализовать неактивные кнопки(НО я думаю, это тема другой..эмм. темы). Так же, я считаю. что тут единственная дыра, это когда пользователь нажмёт на кнопку во время чтения из файла. С другой стороны, для выхода из паузы, можно придумать один единственный код: какие нибудь 8888, да он пропустит одну итерацию в цикле, но в итоге всё ровно продолжит программу. .h #ifndef THREE_H #define THREE_H void start(bool stoper); #endif // THREE_H
.Cpp #include "mainwindow.h" #include <math.h>
#include <iostream> using namespace std;
#include <thread> //две библиотеки, #include <chrono> //для потоков #include "three.h" #include <stdlib.h>
void one(bool stoper){ int i=0; char str[10]; int n=0; FILE* fan;
while(stoper==false){ cout<<"i="<<i<<endl; i++; this_thread::sleep_for(chrono::milliseconds(1500));
fan=fopen("test.txt","r"); while(!feof (fan)) { if (fgets(str, 10, fan)) n = atoi(str); cout<<"s="<<str<<endl; this_thread::sleep_for(chrono::milliseconds(1000)); cout<<"n="<<n<<endl; this_thread::sleep_for(chrono::milliseconds(1000)); }
this_thread::sleep_for(chrono::milliseconds(3000)); if(n==1){ while(n==1){ cout<< "pause" << endl; this_thread::sleep_for(chrono::milliseconds(1000)); rewind(fan); while(!feof (fan)) { cout<< "@"; if (fgets(str, 10, fan)) n = atoi(str); cout<<"n in pause="<< n << "pause" << endl; } } cout<< "continue" << endl; this_thread::sleep_for(chrono::milliseconds(200)); } //stoper=true; } fclose(fan); }
void start(bool stoper){ thread th(one,stoper); th.detach(); }
MainWindow::MainWindow(QWidget *parent): MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this);
FILE* fn; fn=fopen("test.txt", "w"); fprintf(fn,"111"); fclose(fn); } Кнопки(Да, я там использовал глобальную переменную, которую и хотел изменять, её по сути можно удалить): bool stoper=false;
void MainWindow::on_pushButton_clicked()//старт { if(stoper==false) start(stoper); }
void MainWindow::on_pushButton_2_clicked()//пауза { FILE* f; f=fopen("test.txt","w");
if(f == NULL) { printf("не могу открыть файл '%s'", "test.txt"); } else
fprintf(f,"1"); fclose(f); }
void MainWindow::on_pushButton_3_clicked()//продолжить { FILE* f; f=fopen("test.txt","w");
if(f == NULL) { printf("не могу открыть файл '%s'", "test.txt"); } else
fprintf(f,"32"); fclose(f); }
|
|
|
25
|
Qt / Вопросы новичков / Re: Пауза
|
: Май 21, 2020, 22:42
|
Так. В общем, я сделал три кнопки:Пауза, продолжить и старт. Старт запускает программу и она сидит в цикле(пока, не тру), если паузы так и не произошло, то просто выйдет из него поставив тру. По пути она будет считывать файл в котором будет лежать ключ(ну просто код), собственно этот код изменяется нажатием пауза. То есть пауза, просто берёт файл, переписывает его содержимое в единичку(можно сказать что это ключ для паузы). собственно, когда глобальная функция прочтёт из файла единицу, она войдёт в замкнутый цикл.На всякий случай я там оставил таймер. там тоже происходит чтение файла и если была нажата кнопка продолжить, файл пере пишется ну, на любую другую цифру(например 2). То есть файлом, можно игнорировать такую вещь, как потоки и передавать послания в любые другие потоки или основной. Можете назвать это костылём, но это работает идеально, так ещё и оставляет возможность для модификаций, например для сериализации кода(что пригодится для сохранения и загрузки).
В итоге: Пауза и продолжить, просто переписывают по нажатию кнопки текст в файле, а циклы являются скажем так, контрольными точками или чекпоинтами.
|
|
|
26
|
Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
|
: Май 21, 2020, 00:42
|
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле. В любом случае, я бы хотел знать, правильно ли я конекты записал(вначале он берёт поле, отслеживая с него сигнал о изменении, в (this), отправляя обрабатывать в слот(block_symbols_in_polya()). Отладчик кстати показал, что у меня тупо не входит в метод (block_symbols_in_polya(). Там не меняются переменные. Единственная причина, это неправильно написанный сендер или инициализация указателя, ну или, он вообще один раз слушает сигналы, сразу на старте программы и забывает про них.
|
|
|
27
|
Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей.
|
: Май 20, 2020, 19:25
|
если я вместо obj пишу конкретное поле(например lineEdit_1)
на картинке используются не такие простые названия переменных, там всякие Lyner_1_1, может в этом и дело? и кстати вставлять код текстом куда лучше. Нет, не в этом. Дело в том, что мы не обращаемся к ui, то есть к графическому интерфейсу. Нужно обратится к ui, от него обратится к конкретному объекту и сделать конкретное дело. В моём случае, я не могу обратится к конкретному объекту, мне нужно чтобы программа сама поняла к какому объекту ей нужно обратится.Я не знаю как ей это дать понять. Я читал документацию и нашёл какой то sender, который по описанию вроде как именно это и делает. Узнал как его использовать. Однако полученный объект не пропускает компилятор. Здесь мне уже успели подсказать. что можно убрать ui. Теперь я понял, что в таком случае, мы будем применять изменения к объекту, которая переменная, а не поле в программе. Такое компилятор пропускает, но такой код не имеет смысла. Вот в чём проблема. То есть, программа сама должна узнавать, какое поле кинуло сигнал.Для этого я кинул скрин с сигналами, может я не правильно отправляю сигнал, или может сендер не так использую.
|
|
|
29
|
Qt / Вопросы новичков / Re: Пауза
|
: Май 20, 2020, 16:10
|
Ну если "без затей" то просто sleep в цикле, напр C++ (Qt) void CheckPause( void ) while (pauseFlag) QThread::sleep(20); }
И по вставлять эту функцию в тело длинных расчетов. Кнопочка устанавливает переменную pauseFlag. И, кстати, "прерывать" и "останавливать" не одно и то же Так, то есть, обернуть всю функцию с расчётами в кокон из while(pauseFlag)? На само деле я не знаю что такое pauseFlag. Я к тому, что, нужны ли там библиотеки? И я так подразумеваю, что в итоге пауза будет ставится не сразу по нажатию кнопки, а пока она сигнал не поймает?
|
|
|
|
|