2016-11-14 21 views
0

メニューバーのWindowsファイルシステムエクスプローラのようなツールバーをQtに追加する必要があります。(Windows 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(); 
} 

これらは、第二溶液との結果のスクリーンショットです:I最初の起動アプリケーション:

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

私はその幅、右側にあるウィジェットを減らします脱落した。それから私は、ドロップダウンリストにそれらを表示するには、矢印をクリックして、それらがすべてにQLineEdit以外表示されます。

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

は、ここでは、誰かが問題が何であるかを知っていますか?ありがとう。

答えて

1

残念ながら、ツールバーはQMainWindowに埋め込まれていると正しく機能します。良いニュースは、それがウィジェットであるかのようにQMainWindowを使用できることです。親ウィジェットを別のウィジェットに親子化することができます。その後、スタンドアロンウィンドウにはなりません。私はこれをして、それはうまく動作します。私はQt Designerを使ってオブジェクトを作成していましたが、QMainWindowメニューバーはデザイナーが自動的に作成するため、削除する必要がありました。

これは直感的なことではありませんが、うまく動作し、それはかなり簡単な変更です。あなたがそれをした理由を説明するよく書かれたコメントは、将来コードを読んでいる誰にでも歓迎されるでしょう...

0

私はQMainWindowでテストしようとしましたが、私は仕事をしていました。複雑なウィンドウ(過去に多くの人がそれに取り組んでいました)として、私はすぐに仕事を終わらせなければなりませんでした。だからWeb上のいくつかの調査の後、ツールバーが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:私は今(と作品を制御し、私はそれらをテストした)ので、結果が正しい

enter image description here

、しかし:

#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); 
} 

だから今ここで私は、ウィンドウの幅を小さくするとき私が得るものです縦書きではなく横書きで拡張子リストを表示できるかどうかを知りたいですか? (私は、過去のアクションの右側にある「オープン」アクションの右にある「過去の」アクションを意味し、過去のアクションの右側には「セーブする」アクションを意味する)あなたの助けに感謝します。

関連する問題