2016-11-14 6 views
0

Qt에 툴바를 추가해야합니다. 윈도우 툴바는 메뉴 막대 아래에 있습니다 (윈도우 7에 있습니다). 즉, 윈도우 폭이 축소되었을 때, 표시 할 수있는 충분한 장소가 자동으로 숨겨지고 드롭 다운 목록에 표시됩니다 (도구 모음의 오른쪽에 나타나는 화살표를 클릭하면 표시됨). 내가 먼저 내가 웹에 발견 코드를 붙여 복사Qt 툴바 확장 버튼 관련 문제

#include <QApplication> 
#include <QAction> 
#include <QMainWindow> 
#include <QLineEdit> 
#include <QToolBar> 
#include <QHBoxLayout> 



void initWindow(QMainWindow* w); 


int main(int argc, char *argv[]) 
{ 
    Q_INIT_RESOURCE(application); 

    QApplication app(argc, argv); 

    QMainWindow mainWin; 
    initWindow(&mainWin); 
    mainWin.show(); 


    return app.exec(); 
} 




void initWindow(QMainWindow* w) 
{ 
    QLineEdit* searchBar = new QLineEdit; 

    QAction* newAct = new QAction(QIcon(":/images/new.png"), "&New", w); 
    newAct->setShortcuts(QKeySequence::New); 

    QAction* openAct = new QAction(QIcon(":/images/open.png"), "&Open...", w); 
    openAct->setShortcuts(QKeySequence::Open); 

    QAction* saveAct = new QAction(QIcon(":/images/save.png"), "&Save", w); 
    saveAct->setShortcuts(QKeySequence::Save); 

    QAction* cutAct = new QAction(QIcon(":/images/cut.png"), "Cu&t", w); 
    cutAct->setShortcuts(QKeySequence::Cut); 

    QAction* copyAct = new QAction(QIcon(":/images/copy.png"), "&Copy", w); 
    copyAct->setShortcuts(QKeySequence::Copy); 

    QAction* pasteAct = new QAction(QIcon(":/images/paste.png"), "&Paste", w); 
    pasteAct->setShortcuts(QKeySequence::Paste); 


    QToolBar* fileToolBar = w->addToolBar("File"); 
    fileToolBar->addAction(newAct); 
    fileToolBar->addAction(openAct); 
    fileToolBar->addAction(saveAct); 

    QToolBar* editToolBar = w->addToolBar("Edit"); 
    editToolBar->addAction(cutAct); 
    editToolBar->addAction(copyAct); 
    editToolBar->addAction(pasteAct); 
    editToolBar->addWidget(searchBar); 

} 

을 ...하지만 문제는 그 코드 만 QMainWindow에 도구 모음 작동 (그리고 QMainWindow :: addToolbar() 메서드를 사용하여 추가). 그러나 내가 작업하고있는 코드에 QWindow가 아닌 ​​QWidget을 사용해야합니다. 그래서 나는 수평 레이아웃을 만들었고 몇 가지 도구 (QLineEdit 및 여러 QAction)를 추가했으며 QAction에서는 제대로 작동하지만 QLineEdit에서는 작동하지 않습니다. 화살표를 클릭하면 모든 숨겨진 QAction이 가시적이지만 QLineEdit는 표시되지 않습니다. 여기 내 코드입니다 :

#include <QApplication> 
#include <QtGui/QWindow> 
#include <QToolbar> 
#include <QVBoxLayout> 
#include <QMainWindow> 
#include <QPushButton> 
#include <QAction> 
#include <QIcon> 
#include <QLineEdit> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget* w = new QWidget; 


    QHBoxLayout* tb1 = new QHBoxLayout; 
    tb1->addWidget(new QPushButton("item11")); 
    tb1->addWidget(new QPushButton("item12")); 
    tb1->addWidget(new QPushButton("item13")); 
    tb1->addWidget(new QPushButton("item14")); 

    QHBoxLayout* spacerLayout = new QHBoxLayout; 
    spacerLayout->addSpacerItem(new QSpacerItem(50, 20, QSizePolicy::MinimumExpanding,QSizePolicy::Fixed)); 
    spacerLayout->setAlignment(Qt::AlignJustify); 

    QWidget* sep = new QWidget; 
    QRect rect = sep->geometry(); 
    rect.setWidth(0); 
    sep->setGeometry(rect); 
    QToolBar* tb3 = new QToolBar; 
    QLineEdit* searchBar = new QLineEdit; 
    QAction* item31 = new QAction(QIcon(":/images/cut.png"), "cut"); 
    QAction* item32 = new QAction(QIcon(":/images/copy.png"), "copy"); 
    QAction* item33 = new QAction(QIcon(":/images/open.png"), "open"); 
    QAction* item34 = new QAction(QIcon(":/images/paste.png"), "past"); 
    QAction* item35 = new QAction(QIcon(":/images/save.png"), "save"); 
    tb3->addWidget(sep); 
    tb3->addWidget(searchBar); 
    tb3->addAction(item31); 
    tb3->addAction(item32); 
    tb3->addAction(item33); 
    tb3->addAction(item34); 
    tb3->addAction(item35); 

    QVBoxLayout* mainLayout = new QVBoxLayout; 
    QHBoxLayout* topLayout = new QHBoxLayout; 

    topLayout->addLayout(tb1); 
    topLayout->addLayout(spacerLayout); 
    topLayout->addWidget(tb3); 


    QHBoxLayout* bottomLayout = new QHBoxLayout; 
    bottomLayout->addWidget(new QPushButton); 

    mainLayout->addLayout(topLayout); 
    mainLayout->addLayout(bottomLayout); 

    w->setLayout(mainLayout); 
    w->show(); 

    return app.exec(); 
} 

이들은 2 용액과 결과의 스크린 샷이다 : 나는 처음 실행 응용 프로그램 :

http://img4.hostingpics.net/pics/224120tb1.jpg

나는 그것의 폭, 오른쪽에있는 위젯을 감소 disapeared. QLineEdit 제외하고 그런 다음 드롭 다운 목록에이를 표시 화살표를 클릭하고 그들은 모두 표시됩니다

http://img4.hostingpics.net/pics/903380tb2.jpg

사람이 여기있어 문제가 무엇인지 아는 사람? 감사.

답변

1

저는 도구 모음이 QMainWindow에 포함 된 경우에만 올바르게 작동합니다. 좋은 소식은 위젯처럼 QMainWindow를 사용할 수 있다는 것입니다. 다른 위젯을 부모로 지정할 수 있으며 독립형 창이 아닙니다. 나는 이것을했고, 그것은 잘 작동한다. Qt Designer를 사용하여 객체를 만들고 있었고 Designer가 자동으로 생성하므로 QMainWindow 메뉴 막대를 제거해야했습니다.

이것은 직관적 인 일이 아니지만 잘 작동하며 매우 쉽게 변경됩니다. 왜 그렇게했는지 설명하는 잘 쓰여진 설명은 앞으로 코드를 읽는 다른 사람에게 환영받을 것입니다 ...

0

답장을 보내 주셔서 감사합니다. QMainWindow로 테스트를 시도했지만 완전히 레이아웃을 엉망으로 만들었습니다. 내가 일하고 복잡한 윈도우 (많은 사람들이 과거에 그 일을 했었기 때문에)에서 곧 일을 마쳐야한다. 나는 곧 새로운 접근법을 시도했다. 그래서 웹에 대한 연구가 끝난 후에 툴바가 QMainWindow에 있지 않더라도 툴바를 원한다는 것을 알았지 만, QWidgetAction의 파생 된 클래스에 의해 QToolBar에 포함시키고 자하는 모든 QWidget을 대체해야합니다. 그들을 QWidgetAction :: createWidget() 메소드로 인스턴스화하십시오. 그래서 제대로 작동이 코드를했다 :

MAIN.CPP :

#include <QApplication> 
#include <QtGui/QWindow> 
#include <QToolbar> 
#include <QVBoxLayout> 
#include <QMainWindow> 
#include <QPushButton> 
#include <QAction> 
#include <QIcon> 
#include <QLineEdit> 
#include <QSlider> 
#include <QVariant> 
#include <QCheckBox> 
#include <QWidgetAction> 

#include "QMyWidgetAction.h" 


void test2(QApplication& app); 




int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    test2(app); 
    return app.exec(); 
} 

void test2(QApplication& app) 
{ 

    QWidget* w = new QWidget; 

    QHBoxLayout* l1 = new QHBoxLayout; 
    l1->addWidget(new QPushButton("item11")); 
    l1->addWidget(new QPushButton("item12")); 
    l1->addWidget(new QPushButton("item13")); 
    l1->addWidget(new QPushButton("item14")); 

    QHBoxLayout* l2 = new QHBoxLayout; 
    l2->addSpacerItem(new QSpacerItem(50, 20, QSizePolicy::MinimumExpanding,QSizePolicy::Fixed)); 
    l2->setAlignment(Qt::AlignJustify); 

    QHBoxLayout* l3 = new QHBoxLayout; 
    QToolBar* tb = new QToolBar; 
    l3->addWidget(tb); 


    QAction* item31 = new QAction(QIcon(":/images/cut.png"), "cut"); 
    QAction* item32 = new QAction(QIcon(":/images/copy.png"), "copy"); 
    QAction* item33 = new QAction(QIcon(":/images/open.png"), "open"); 
    QAction* item34 = new QAction(QIcon(":/images/paste.png"), "past"); 
    QAction* item35 = new QAction(QIcon(":/images/save.png"), "save"); 
    QLineEdit* searchBar = new QLineEdit; 
    QMyWidgetAction* widgetAction = new QMyWidgetAction(tb); 
    QLineEditAction* lineEditAction = new QLineEditAction(tb); 

    tb->addSeparator(); 
    tb->addWidget(searchBar); 
    tb->addAction(item31); 
    tb->addAction(item32); 
    tb->addAction(item33); 
    tb->addAction(item34); 
    tb->addAction(item35); 
    tb->addAction(widgetAction); 
    tb->addAction(lineEditAction); 

    QVBoxLayout* mainLayout = new QVBoxLayout; 
    QHBoxLayout* topLayout = new QHBoxLayout; 


    topLayout->addLayout(l1); 
    topLayout->addLayout(l2); 
    topLayout->addLayout(l3); 


    QHBoxLayout* bottomLayout = new QHBoxLayout; 
    bottomLayout->addWidget(new QPushButton); 

    mainLayout->addLayout(topLayout); 
    mainLayout->addLayout(bottomLayout); 

    w->setLayout(mainLayout); 
    w->show(); 

} 

QMyWidgetAction.h :

#ifndef QMAYAWIDGETACTION_H 
#define QMAYAWIDGETACTION_H 

#include <QObject> 
#include <QWidget> 

#include <QWidgetAction> 

class QLineEdit; 

class QMyWidgetAction : public QWidgetAction 
{ 
    Q_OBJECT 
public: 
    QMyWidgetAction(QWidget* parent); 
    QWidget* createWidget(QWidget* parent); 

}; 


class QLineEditAction : public QWidgetAction 
{ 
    Q_OBJECT 
public: 
    QLineEditAction(QWidget* parent); 
    QWidget* createWidget(QWidget* parent); 

protected slots: 
    virtual void searchTextChanged(const QString& text); 

private: 
    QLineEdit* fWidget; 

}; 

#endif // QMAYAWIDGETACTION_H 

QMyWidgetAction.CPP : 그래서 지금 여기

#include <QApplication> 
#include <QtGui/QWindow> 
#include <QToolbar> 
#include <QVBoxLayout> 
#include <QMainWindow> 
#include <QPushButton> 
#include <QAction> 
#include <QIcon> 
#include <QLineEdit> 
#include <QSlider> 
#include <QVariant> 
#include <QCheckBox> 
#include <QWidgetAction> 

#include "QMyWidgetAction.h" 


QMyWidgetAction::QMyWidgetAction(QWidget* parent) 
    : QWidgetAction(parent) 
{ 

} 


QWidget* QMyWidgetAction::createWidget(QWidget* parent) 
{ 
    QPushButton* widget = new QPushButton("bouton", parent); 
    widget->setMinimumSize(100, 30); 
    return widget; 
} 


QLineEditAction::QLineEditAction(QWidget* parent) 
    : QWidgetAction(parent) 
{ 

} 


QWidget* QLineEditAction::createWidget(QWidget* parent) 
{ 
    fWidget = new QLineEdit(parent); 
    connect(fWidget, SIGNAL(textChanged(QString)), this, SLOT(searchTextChanged(QString))); 
    fWidget->setMinimumSize(100, 30); 
    return fWidget; 
} 


void QLineEditAction::searchTextChanged(const QString& text) 
{ 
    fWidget->setMinimumWidth(fWidget->minimumWidth() + 10); 
} 

내가 창 폭 감소 할 때 무엇을 얻을 : 지금

enter image description here

그래서 결과는 (내가 그들을 테스트 및 작동을 제어) 올바른입니다,하지만 난 세로 대신 세로 확장 목록을 표시 할 수 있는지 알고 싶습니다. (나는 "열린"행동의 오른쪽에있는 "과거"행동을 의미하고, 과거 행동의 오른쪽에있는 "행동"을 저장합니다.) 여러분의 도움에 감사드립니다.