Проблемы с созданием слота для помещения текста в QTextEdit - PullRequest
1 голос
/ 10 марта 2019

Я провел довольно тщательное исследование, так как боролся с проблемой слотов, но так как результаты поиска в Google неуклонно становились все более и более фиолетовыми, я решил просто спросить SO приятелей =) Пожалуйста, обратите внимание, что я не использующий QtCreator или какие-либо динамические вещи Мне нужно:

  1. объявляет некоторые строки QStrings, которые являются постоянными
  2. получить некоторые QStrings из QLineEdits
  3. добавить 1 и 2
  4. наконец, поместите их в QTextEdit при нажатии кнопки.

На шаге 1 я объявляю QStrings так:

QString set_1 = "ООО «Хеллманн» (129343, г. Москва, ул. Уржумская, д. 4, стр. 14, ИНН 7722637955, ОГРН 1087746168476) доверяет забор груза - ";
QString set_2 = " - перегружаемого из контейнера ";
QString set_3 = ", в количестве ";
QString set_4 = " паллет, весом ";
QString set_5 = " кг, водителю ";
QString set_6 = ", паспорт ";
QString set_7 = " выдан ";
QString set_8 = ".";
QString set_9 = " На автотранспортном средстве марки ";
QString set_10 = " - ";
QString set_11 = ", прицеп: ";

Затем для шага 2 я делаю QStrings из QLineEdits следующим образом (например, line_b_b - это имя QLineEdit):

QString a = line_b_b.text();
QString b = line_b_a.text();
QString c = line_b_c.text();
QString d = line_b_d.text();
QString e = line_a_b.text();
QString f = line_a_a.text();
QString g = line_a_c.text();
QString h = line_a_d.text();
QString i = line_c_b.text();
QString j = line_c_a.text();
QString k = line_c_c.text();

Для шага 3 я добавляю QStrings из шага 1 с теми, что из шага 2, в переменную с именем "doverka" (пожалуйста, не обращайте внимания на эти кириллические слова):

QString doverka = set_1+a+set_2+b+set_3+c+set_4+d+set_5+e+set_6+f+set_7+g+h+set_8+set_9+i+set_10+j+set_11+k+set_8;

Наконец, на шаге 4 я пытаюсь поместить целое в QTextEdit при нажатии кнопки. И я думаю, что проблема здесь. Я создаю QTextEdit с именем «text»:

QTextEdit text (&dw);
text.show(); 

А потом я пытаюсь создать слот и полагаю, что делаю это совершенно неправильно, поскольку он просто не работает:

QPushButton btn_t ("Создать текст", &dw);
   QObject::connect(
      &btn_t,
      SIGNAL(clicked()),
      &text,
      SLOT([dover](){return text.setText(doverka)}));
   btn_t.show();

Я новичок в Qt, а также в C ++, и поэтому плохо разбираюсь в создании слотов. Здесь я попробовал это с лямбда-функцией, но я явно делаю что-то не так. Может быть, я должен просто поместить лямбда-функцию где-нибудь еще до SLOT? Мой слот не распознается как таковой, когда прога компилируется, я получаю уведомление "нет такого слота". Или, может быть, проблема где-то раньше, например в создании QStrings из QLineEdits (step2)? .. Я довольно беспомощен и очень ценю любые полезные советы! Очень большое спасибо

1 Ответ

3 голосов
/ 10 марта 2019

Вы пытаетесь смешать соединение сигнала / слота Qt старого стиля с новым стилем, который явно не работает. Лямбды можно использовать только с новым стилем соединений. Если вы используете Qt 5, соединение может быть таким:

QObject::connect(
  &btn_t,
  &QPushButton::clicked,
  [&text, &doverka](){
     text.setText(doverka);
  });

Вы должны быть осторожны, чтобы объекты text и doverka не были уничтожены до вызова лямбды, так как они захвачены ссылкой.

В случае использования Qt 4. * вам следует использовать старый синтаксис. В вашем случае просто предоставьте слот в вашем классе и подключите сигнал:

QObject::connect(
  &btn_t,
  SIGNAL(clicked()),
  this,
  SLOT(onClicked()));

Ваш класс должен наследовать от QObject, содержащего слот, такой как:

public slots:
    void onClicked() {
         text.setText(doverka);
     }

Также обратите внимание, что text и doverka должны быть членами класса.

...