Загрузка значения QStringList, полученного из сигнального слота

В моем приложении qt c ++ QStringList отправляется из одного файла cpp (MainWIndow) в другой файл cpp (Dialog) через механизм сигналов и слотов! Я хочу отображать элементы в qtringList в поле со списком в Dialog.ui, когда интерфейс загружается (без нажатия кнопки)!

ниже мой код

    #include "dialog.h"#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);

for(int i=0;i<subMessages.size();i++){
ui->comboBox->addItem(subMessages[i]);

}
}

//slot which is used to get the qstringList
void Dialog::receiveSubMessages(QStringList List){
subMessages=List;

}

QStringList успешно получен через слот (уже проверен). Хотя я использовал цикл for и попытался отобразить (как в коде), в поле со списком ничего не отображалось! Как я могу исправить эту проблему?

0

Решение

Для того, чтобы получить рабочий код, вам нужно разместить свой for Забейся в свой слот:

#include "dialog.h"#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}

//slot which is used to get the qstringList
void Dialog::receiveSubMessages(QStringList List){
ui->comboBox->addItems (List);
}

Если вы хотите заполнить поле со списком содержимого некоторых QStringList на Dialog конструкция, то вы должны либо передать этот список в качестве аргумента конструктора:

Dialog::Dialog(QStringList List, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->comboBox->addItems (List);
}

или позвоните по телефону Dialog::receiveSubMessages() сразу после Dialog строительство объекта:

// somewhere in code, where you construct Dialog object
// ...
auto parent = SomeQWidgetDerivedClass (...);
QStringList someStringList {
"string 1",
"string 2"};
// ...
auto dialog {new Dialog ()};

dialog->receiveSubMessages (someStringList);
// ...

Код, который вы предоставили, никогда не позволит вам достичь желаемого результата, потому что ваш for цикл, который должен заполнить QComboBox выполняется на вашем Dialog создание объекта. В этот момент ваш subMessages пустой. Слот, который вы создали, не вызывается перед конструктором — слот — это просто функция-член, которая может быть вызвана только после создания объекта. Вы можете вызывать функцию-член без объекта, только если сама функция является статической, в этом случае она определенно не является слотом.

1

Другие решения

Я сделал этот ответ скорее, чтобы показать вам, как решить вашу проблему. (У меня такое чувство, что я даже не поняла, в чем твоя настоящая проблема.)

Когда задаешь вопрос, шансы получить полезный ответ увеличиваются, если MCVE предоставлен. (Пожалуйста, перейдите по этой ссылке. Он обучает вас действительно базовым навыкам каждого разработчика ПО должендолжен иметь. Я также рекомендовал бы продолжить Как отлаживать небольшие программы.)

Как я Я понял вашу проблему, я сделал такой MCVE. Это код testQComboBox:

#include <QtWidgets>

int main(int argc, char **argv)
{
// build appl.
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// a QStringList with items
QStringList items;
items
<< QString::fromUtf8("first item")
<< QString::fromUtf8("second item")
<< QString::fromUtf8("third item");
// build GUI
QDialog dlg;
QVBoxLayout vBox;
QComboBox cmbBox;
cmbBox.addItems(items);
vBox.addWidget(&cmbBox);
dlg.setLayout(&vBox);
dlg.show();
app.exec();
// done
return 0;
}

Я скомпилировал его в VS2013 с Qt 5.9.2 для Windows 10 (64 бит). Вот как это выглядит:

Снимок testQComboBox

Как видите, использование combobox довольно просто — никаких секретных люков для его использования. Фактический код, который напрямую связан с QComboBox это точно 4 строки кода:

  QVBoxLayout vBox;
QComboBox cmbBox;
cmbBox.addItems(items);
vBox.addWidget(&cmbBox);

И есть ровно одна строка кода, где элементы добавляются в QComboBox:

  cmbBox.addItems(items);

Замечания:

я использовал QComboBox::addItems() вместо QComboBox::addItem() поскольку первый уже имеет встроенный цикл, чтобы добавить полный QStringList, Это не имеет никакого значения для цикла, который вы использовали в своем коде Dialog::Dialog(),

Итак, наконец, я смею сделать следующее утверждение:

Если ваш выпадающий список не показывает элементы, то:

  1. Вы добавили элементы из пустого списка.

  2. Или вы забыли добавить элементы из списка.

  3. Или что-то очень странное случилось.

Я бы всегда делал ставку на 1. или 2. причина — 3. причина только для реальных экстренных случаев (например, сломанная установка Qt).


По поводу 3. причины:

Я видел много вопросов, где были представлены некоторые строки невинно выглядящего кода, которые выглядели точно так, как должны, но были объявлены неудачными. И, наконец, почти каждый раз это показывало, что эти линии работали нормально, когда изолированы в MCVE но они не в исходном коде. Как это может случиться? Либо есть некоторый контекст, который изменяет поведение кода в вашей исходной программе, либо UB Неопределенное поведение. Что-то еще делает плохие вещи, но вместо того, чтобы сразу же рушить ваш процесс (что будет означать, что вам повезло), он некоторое время все больше и больше портит данные, пока, наконец, все не сломается полностью. Смотреть в дамп памяти совсем не помогает. Поэтому моя рекомендация Как отлаживать небольшие программы.

1

По вопросам рекламы [email protected]