2017-12-30 88 views
0

현재 Qt5로 데이터베이스 관리 소프트웨어를 개발 중입니다. 나는 프로그램의 메인 레이아웃과 연결된 위젯 중 일부를 숨기고 싶다. 그리고 다시 보여주기 위해 (QComboBox를 사용하여 보여줄지 말지 선택). 모든 위젯은 MainWindow 클래스의 멤버입니다.show() - C++/Qt5 뒤에 QWidgets이 보이지 않음

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 (true)를하고는, setVisible (false)를, 그러나있는 상응하는, 그것은 아무것도 변경되지 않습니다. 또한이 스레드를 살펴 보았습니다. QWidget not showing after calling show() 대부분 파이썬이기 때문에 대답을 이해하지 못했습니다.

, 당신의 시간 동안 정말 이유는 코드를 통해 레이아웃에 위젯을 추가 볼 수 없습니다

+0

문제는 오타 (typo)로 인해 발생합니다. 'if'문에 쉼표가 하나 더 있습니다. https://github.com/Sysmetryx/ESME-PROJET-IHM-BDD/blob/V.2Debug/mainwindow.cpp # L171 :'else if (reqSelect-> currentText() == "Insertion de donné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

부모님에 대한 팁 주셔서 감사합니다, 나는 그들을 추가 할 것입니다, 아마 청소기 것입니다. 선생님 중 한 명이 불행히도 UI를 사용하지 않아야합니다. – Sysmetryx

+1

PRO 팁 : 먼저 디자이너를 사용하여 만든 다음 생성 된 코드를 프로젝트에 복사하고 .ui를 삭제하십시오. 그러면 교사는 불평 할 수 없습니다! –