2016-11-14 138 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

所以结果是正确的(和控制工作,我对它们进行测试),但现在我想知道是否可以水平显示扩展列表而不是垂直显示? (我的意思是“过去”行动在“开放”行动的权利,“保存”在过去行动的权利行动等)感谢您的帮助。