0

私のqt c++アプリケーションでは、シグナルとスロットメカニズムを介して、QStringListが1つのcppファイル(MainWIndow)から別のcppファイル(Dialog)に送信されます! インターフェイスがロードされたとき(ボタンクリックなし)、Dialog.uiのコンボボックスにqtringListの要素を表示したい!

以下は私のコードです

    #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 ループを使用して (コードのように) 表示を試みましたが、コンボ ボックスには何も表示されませんでした。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

1

問題を解決する方法を示すために、この回答を行いました。(あなたの実際の問題が何であるかさえ理解していなかったと感じています。)

質問をするときに、MCVEが提供されていると、役立つ回答が得られる可能性が高くなります。(このリンクをたどってください。すべての S/W 開発者が持つべき本当に基本的なスキルを教えてくれます。小さなプログラムをデバッグする方法 もフォローアップすることをお勧めします。)

あなたの問題を理解したので、そのような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;
}

Windows 10(64ビット)でQt 5.9.2を使用してVS2013でコンパイルしました。これはどのように見えるかです:

testQComboBox のスナップショット

ご覧のとおり、コンボボックスの使い方はかなり簡単です。秘密のトラップ ドアを使用する必要はありません。直接関連する実際のコードQComboBoxは、正確に4行のコードです。

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

そして、アイテムが に追加されるコードは 1 行だけですQComboBox

  cmbBox.addItems(items);

ノート:

QComboBox::addItems()前者にQComboBox::addItem()は完全なQStringList. コードで使用したループに違いはありませんDialog::Dialog()

ということで、最後にあえて以下の発言をします。

コンボボックスにアイテムが表示されない場合:

  1. 空のリストから項目を追加しました。

  2. または、リストからアイテムを追加するのを忘れました。

  3. または、非常に奇妙なことが起こりました。

私は常に 1. または 2. の理由に賭けます。3. の理由は、実際の緊急事態 (Qt のインストールの破損など) のみです。


3.理由について:

無邪気なコードのいくつかの行が提示され、本来あるべき姿とまったく同じように見えたが、失敗したと主張されているという多くの質問を見ました。そして最後に、ほとんどの場合、これらの行はMCVEで分離すると正常に機能することが示されましたが、元のコードでは機能しませんでした。これはどのように起こりますか?元のプログラムのコードの動作を変更するコンテキストがあるか、未定義の動作であるUBがあります。他の何かが悪いことをしますが、プロセスをすぐにクラッシュさせるのではなく (つまり、幸運であることを意味します)、しばらくの間、データをますます破壊し続け、最終的にすべてが完全に壊れます。コアダンプを調べてもまったく役に立ちません。したがって、小さなプログラムをデバッグする方法の私の推奨事項。

于 2017-12-03T08:12:57.293 に答える