2017-12-30 41 views
0

現在Qt5でデータベース管理ソフトウェアを開発中です。私は、プログラムの主なレイアウトにリンクされた私のウィジェットの一部を隠しておきたいと思います(QComboBoxを使って表示するかどうかを選択する)。すべてのウィジェットはMainWindowクラスのメンバーです。show()の後にウィジェットが表示されない - C++/Qt5

void MainWindow::mode1Rebuild() 
{ 
    mod1TableDesc->show(); 
    fieldSelect->show(); 
    value->show(); 
    filter1->show(); 
    exactBox->show(); 
    borderBox->show(); 
    lowvalue->show(); 
    lowvalueDesc->show(); 
    highvalue->show(); 
    highvalueDesc->show(); 
    recherche1->show(); 
} 

しかし、私が管理したことがない:私はそれらを表示する方法

void MainWindow::mode1Cleanup() 
{ 
    mod1TableDesc->hide(); 
    fieldSelect->hide(); 
    value->hide(); 
    filter1->hide(); 
    exactBox->hide(); 
    borderBox->hide(); 
    lowvalue->hide(); 
    highvalue->hide(); 
    recherche1->hide(); 
    highvalueDesc->hide(); 
    lowvalueDesc->hide(); 
} 

そして、これは次のようになります。これは私がそれらを隠す方法です

void MainWindow::mode1Buildup() 
{ 
    extractTables(); 
    mod1TableDesc = new QLabel("Cette requête a pour but \n de filtrer la table client \n avec ce paramètre :"); 
    mainLayout->addWidget(mod1TableDesc,3,0,1,1,Qt::AlignLeft); 
    QSqlQuery query; 
    if(query.exec("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_SCHEMA='auchan' AND TABLE_NAME='approvisionnement')")) 
    { 
     while(query.next()) 
     { 
      fieldNames.push_back(q2c(query.value(0).toString())); 
     } 
     createFieldBox(); 
    } 
    else 
    { 
     QMessageBox::about(this, "Tables non récupérées", "La récupération des tables a échouée"); 
    } 
    exactBox = new QComboBox; 
    exactBox->addItem("Contient"); 
    exactBox->addItem("Commence par"); 
    exactBox->addItem("fini par"); 
    exactBox->addItem("Condition"); 
    mainLayout->addWidget(exactBox, 5,0,1,1,Qt::AlignLeft); 
    filter1 = new QComboBox; 
    filter1->addItem("="); 
    filter1->addItem("<="); 
    filter1->addItem(">="); 
    filter1->addItem("<"); 
    filter1->addItem(">"); 
    mainLayout->addWidget(filter1,6,0,1,1,Qt::AlignLeft); 
    value = new QLineEdit(); 
    mainLayout->addWidget(value,7,0,1,1,Qt::AlignLeft); 
    value->setObjectName("test1"); 
    borderBox = new QCheckBox("Cochez pour avoir une valeur \n comprise dans un ensemble", this); 
    connect(borderBox, SIGNAL(clicked(bool)), this, SLOT(makeInter())); 
    mainLayout->addWidget(borderBox, 8,0,1,1,Qt::AlignLeft); 
    lowvalueDesc = new QLabel("Entrez la valeur minimum"); 
    mainLayout->addWidget(lowvalueDesc, 9,0,1,1,Qt::AlignLeft); 
    lowvalueDesc->setVisible(false); 
    lowvalue = new QLineEdit(); 
    mainLayout->addWidget(lowvalue, 10,0,1,1,Qt::AlignLeft); 
    lowvalue->setVisible(false); 
    highvalueDesc = new QLabel("Entrez la valeur maximum"); 
    mainLayout->addWidget(highvalueDesc, 11,0,1,1,Qt::AlignLeft); 
    highvalueDesc->setVisible(false); 
    highvalue = new QLineEdit(); 
    mainLayout->addWidget(highvalue, 12,0,1,1,Qt::AlignLeft); 
    highvalue->setVisible(false); 
    recherche1 = new QPushButton("recherche"); 
    connect(recherche1, SIGNAL(clicked(bool)), this, SLOT(execReq1())); 
    mainLayout->addWidget(recherche1,13,0,1,1,Qt::AlignLeft); 


} 

: これは私がウィジェットを作成する方法でありますそれらを再度表示する。それらはメインレイアウトから削除されません。私はガベージコレクタにキャッチされているかもしれないと思っていますが、チェック/修正方法がわかりません。完全なコードたくに関して

https://github.com/Sysmetryx/ESME-PROJET-IHM-BDD/tree/V.2Debug

を私もしてみました - >のsetVisible(真)とのsetVisible(false)を、同等のもの、それは何も変わっていません。 また、私はこのスレッドを見ました: QWidget not showing after calling show() そして、答えが分からないのは、主にPythonであるからです。

は、私は本当に理由は、コードを経由してレイアウトするウィジェットを追加表示されません、お時間 よろしく、 ネイサン

+0

問題はtypoによって引き起こされます。あなたは 'if'ステートメントにカンマが1つあります:https://github.com/Sysmetryx/ESME-PROJET-IHM-BDD/blob/V.2Debug/mainwindow.cpp #L171: 'else if(reqSelect-> currentText()==" Insertion dedonnées ")**; **'、https://github.com/Sysmetryx/ESME-PROJET-IHM-BDD/blob/V。 2Debug/mainwindow.cpp#L380: 'if(query.exec(sqlQuery))**; **'とhttps://github.com/Sysmetryx/ESME-PROJET-IHM-BDD/blob/V.2Debug/mainwindow .cpp#L424: 'if(query.exec(queryText))**; **'。これらのカンマを削除すると、プログラムが正しく実行されます。 – eyllanesc

+0

これらのすべてのケースでは、次の警告が返されます:**警告:この 'if'句はガードしません。[-Wmisleading-indentation] **、したがって、この質問は単純な誤植であるため閉じなければなりません。 SOコミュニティをまったく助けません。 – eyllanesc

+0

それを見ていただきありがとうございます、それはすぐに問題を解決しました。 それは本当に閉鎖されるべきです。タイプミスであなたを気にして申し訳ありません。 – Sysmetryx

答えて

0

、ありがとうございました。ウィジェットをUIファイルに配置し、コード内にセットアップし、開始時に非表示にします。そのは、コードを明確にして問題を解決するのに役立ちます。

UIファイルにウィジェットを作成したくない場合。新しいウィジェットには「親」を割り当てる必要があります。たとえば :

value = new QLineEdit(); 

は間違ったアプローチです。次のテンプレートを使用してください:

value = new QLineEdit(this); 

これも役立ちます。

+0

親を渡すことをお勧めしますが、それは義務的でも必要でもありません。 – eyllanesc

+0

親についてのヒントをありがとう、私はそれらを追加します、それはおそらくクリーナーでしょう。 残念なことに私の教師の1人はUIを使用しないことが必要です。 – Sysmetryx

+1

PROヒント:まずデザイナーを使用して作成し、生成されたコードをプロジェクトにコピーして.uiを削除します。あなたの先生は不平を言うことはできません! –

関連する問題