2016-06-28 4 views
2

브라우저가있는 창이 있습니다. 위로 도구 모음입니다. 창 하단에는 검색 창이 있습니다. 검색 막대에는 닫기 버튼 [x]이 있습니다. 사용자가 닫기 버튼을 클릭하면 막대가 사라지 길 원합니다. 사용자가 CTRL + F를 누를 때만 표시 줄을 표시합니다. close (닫기) 부울을 .hide() 명령과 연결하려고 시도했지만 응용 프로그램이 충돌합니다. 도움이 필요해.임시 검색 창을 숨기는 방법?

enter image description here

cpp를

DocumentationWin::DocumentationWin (QWidget * parent){ 
    docs = new QTextBrowser(this); 

    //Prepare toolbar 
    toolbar = new QToolBar(this); 
    //add stuff to toolbar 


    //Prepare footer bar 
    searchlabel = new QLabel(tr("Find in page:"),this); 
    resultslabel = new QLabel("",this); 
    searchinput = new QLineEdit(); 

    findprev = new QToolButton(this); 
    findprev->setArrowType(Qt::UpArrow); 
    connect(findprev, SIGNAL(clicked()), this, SLOT (clickFindPrev())); 
    findnext = new QToolButton(this); 
    findnext->setArrowType(Qt::DownArrow); 
    connect(findnext, SIGNAL(clicked()), this, SLOT (clickFindNext())); 

    QStyle *style = qApp->style(); 
    QIcon closeIcon = style->standardIcon(QStyle::SP_TitleBarCloseButton); 
    QPushButton *closeButton = new QPushButton(this); 
    closeButton->setIcon(closeIcon); 
    closeButton->setFlat(true); 
    connect(closeButton, SIGNAL(clicked()), this, SLOT (clickCloseFind())); 
    QWidget *bottom = new QWidget; 
    QHBoxLayout *footer = new QHBoxLayout(); 
    casecheckbox = new QCheckBox(tr("Case sensitive"),this); 

    footer->setContentsMargins(5,5,5,5); 
    footer->addWidget(searchlabel); 
    footer->addSpacing(3); 
    footer->addWidget(searchinput); 
    footer->addWidget(findprev); 
    footer->addWidget(findnext); 
    footer->addSpacing(10); 
    footer->addWidget(casecheckbox); 
    footer->addSpacing(10); 
    footer->addWidget(resultslabel); 
    footer->addStretch(1); 
    footer->addWidget(closeButton); 
    bottom->setLayout(footer); 


    //Prepare main layout 
    layout = new QVBoxLayout; 
    layout->setContentsMargins(0,0,0,0); 
    layout->setSpacing(0); 
    layout->addWidget(toolbar); 
    layout->addWidget(docs); 
    layout->addWidget(bottom); 

    this->setLayout(layout); 
    this->show(); 
} 


void DocumentationWin::clickCloseFind(){ 
    bottom->hide(); 
} 

.H

class DocumentationWin : public QDialog 
{ 
    Q_OBJECT 
    public: 
    DocumentationWin(QWidget * parent); 

    protected: 
    virtual void keyPressEvent(QKeyEvent *); 

    private slots: 
    void clickCloseFind(); 

    private: 
    QVBoxLayout* layout; 
    QToolBar* toolbar; 
    QTextBrowser* docs; 
    QBoxLayout* footer; 
    QLabel *searchlabel; 
    QLabel *resultslabel; 
    QLineEdit *searchinput; 
    QToolButton *findprev; 
    QToolButton *findnext; 
    QCheckBox *casecheckbox; 
    QWidget *bottom; 
    QPushButton *closeButton; 
}; 

답변

4

아, 멤버 숨어 로컬 변수의 전형적인 케이스. 이것에 관해서는 상당히 많은 질문이있었습니다. 이것은 잘못된 것입니다 :

QWidget *bottom = new QWidget; 

당신이 원하는 :

bottom = new QWidget; 

동적으로 모든 위젯을 할당하기 때문에 당신은 항상 이러한 문제로 실행하겠습니다 - 그 완전히 불필요합니다.

제안 :

  1. 는 동적으로 할당하지 않는 값으로 자식 위젯과 레이아웃을 잡습니다.

  2. 레이아웃으로 관리되는 위젯에는 부모를 전달하지 마십시오. 배치 된 모든 위젯은 자동으로 상위가됩니다.

  3. 중복해서 setLayout으로 전화하지 마십시오. QLayout은 생성자 인수로 위젯을 가져옵니다.

  4. QWidget::hide()은 슬롯입니다.

  5. 많은 위젯이 텍스트를 생성자 인수로 사용합니다. 당신은, 당신은 괄호를 드롭 할 수있는 new 표현의 생성자에 전달하는 인수가없는 (그러나 우리는이 어쨌든 피하려고)하면

  6. :

    searchinput = new QLineEdit; // not QLineEdit(); 
    
  7. 위젯은 안 보통 show() 자체 공사중입니다. Qt 위젯이 없습니다. 그것은 위젯의 사용자가 할 일을합니다.

  8. C++은 구문 구문을 사용하여 메서드 호출 구문을 오버로드합니다. 두 가지를 구별하려면 ()을 사용한 이전 구문보다 균일 한 초기화 (Type{arg0, arg1, ...})를 사용하는 것이 좋습니다.

다음은 C++ 11을 사용하는 경우 코드가 어떻게 표시되는지 보여줍니다. 이것은 Qt 4 또는 Qt 5로 컴파일됩니다. Qt 4를 대상으로하지 않으면 새로운 연결 구문을 사용해야합니다.

위에서 볼 수 있듯이 하나의 명시 적 동적 할당은 없습니다. 사용 된 유형이 정상이면 C++ 11 코드가 약간 보입니다.

// https://github.com/KubaO/stackoverflown/tree/master/questions/find-hide-38082794 
#include <QtGui> 
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) 
#include <QtWidgets> 
#endif 

class DocumentationWin : public QDialog 
{ 
    Q_OBJECT 
public: 
    explicit DocumentationWin(QWidget * parent = 0); 
private: 
    QVBoxLayout layout{this}; 
    QToolBar toolbar; 
    QTextBrowser docs; 
    QWidget bottom; 
    QHBoxLayout footer{&bottom}; 
    QLabel searchlabel{tr("Find in page:")}; 
    QLabel resultslabel; 
    QLineEdit searchinput; 
    QToolButton findprev; 
    QToolButton findnext; 
    QCheckBox casecheckbox{tr("Case sensitive")}; 
    QPushButton closeButton; 

    Q_SLOT void onFindPrev() {} 
    Q_SLOT void onFindNext() {} 
}; 

DocumentationWin::DocumentationWin(QWidget * parent) : QDialog(parent) { 
    findprev.setArrowType(Qt::UpArrow); 
    connect(&findprev, SIGNAL(clicked()), this, SLOT(onFindPrev())); 
    findnext.setArrowType(Qt::DownArrow); 
    connect(&findnext, SIGNAL(clicked()), this, SLOT(onFindNext())); 

    auto style = qApp->style(); 
    auto closeIcon = style->standardIcon(QStyle::SP_TitleBarCloseButton); 
    closeButton.setIcon(closeIcon); 
    closeButton.setFlat(true); 
    connect(&closeButton, SIGNAL(clicked(bool)), &bottom, SLOT(hide())); 

    footer.setContentsMargins(5,5,5,5); 
    footer.addWidget(&searchlabel); 
    footer.addSpacing(3); 
    footer.addWidget(&searchinput); 
    footer.addWidget(&findprev); 
    footer.addWidget(&findnext); 
    footer.addSpacing(10); 
    footer.addWidget(&casecheckbox); 
    footer.addSpacing(10); 
    footer.addWidget(&resultslabel); 
    footer.addStretch(1); 
    footer.addWidget(&closeButton); 

    layout.setContentsMargins(0,0,0,0); 
    layout.setSpacing(0); 
    layout.addWidget(&toolbar); 
    layout.addWidget(&docs); 
    layout.addWidget(&bottom); 
} 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    DocumentationWin win; 
    win.show(); 
    return app.exec(); 
} 

#include "main.moc" 
관련 문제