2016-11-14 137 views
0

我必須在Qt中添加一個工具欄,就像菜單欄下的Windows文件系統資源管理器(我在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()方法中添加)。但是進入我正在工作的代碼中,我必須將其寫入QWidget,而不是QWindow。所以我創建了一個水平佈局,我添加了幾個小部件(一個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(); 
} 

這些是第二解決方案結果的截圖:我第一次啓動應用程序:

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

當我減少其寬度,窗口小部件,其是右側disapeared。然後我點擊箭頭以顯示他們到下拉列表中,他們都顯示,除了QLineEdit的:

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

是有人在這裏知道的問題是什麼?謝謝。

回答

1

遺憾的是,工具欄僅在嵌入QMainWindow時才能正常工作。好消息是你可以使用QMainWindow,就好像它是一個小部件。您可以將它父項添加到另一個小部件,然後它不會是獨立的窗口。我已經這樣做了,而且效果很好。我使用Qt Designer創建對象,並且我必須移除QMainWindow菜單欄,因爲Designer會自動創建它。

這不是一件很直觀的事情,但它工作得很好,而且這是一個相當簡單的改變。一個寫得很好的評論解釋了爲什麼你這樣做可能會受到其他人在未來閱讀代碼的歡迎...

0

謝謝你的回答,我試圖用QMainWindow進行測試,但它完全搞砸了佈局我工作過,因爲它是一個複雜的窗口(過去有很多人在工作),我不得不盡快完成我的工作,我寧願嘗試一種新的方法。因此,在網絡上進行了一些研究後,我發現即使工具欄不在QMainWindow中,我也可以這樣做,但我必須將QWidget的所有QWidget替換爲由QWidgetAction的派生類組成的QToolBar,並且將它們實例化爲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

所以結果是正確的(和控制工作,我對它們進行測試),但現在我想知道是否可以水平顯示擴展列表而不是垂直顯示? (我的意思是「過去」行動在「開放」行動的權利,「保存」在過去行動的權利行動等)感謝您的幫助。