Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt工具栏扩展按钮的问题_Qt_Qtoolbar - Fatal编程技术网

Qt工具栏扩展按钮的问题

Qt工具栏扩展按钮的问题,qt,qtoolbar,Qt,Qtoolbar,我必须在Qt中添加一个工具栏,比如菜单栏下的Windows文件系统浏览器(我在Windows 7下),这意味着当窗口宽度减小时,没有足够位置显示的图标会自动隐藏并放入下拉列表中(单击工具栏右侧的箭头时显示)。我首先将找到的代码复制粘贴到web: #include <QApplication> #include <QAction> #include <QMainWindow> #include <QLineEdit> #include <QTo

我必须在Qt中添加一个工具栏,比如菜单栏下的Windows文件系统浏览器(我在Windows 7下),这意味着当窗口宽度减小时,没有足够位置显示的图标会自动隐藏并放入下拉列表中(单击工具栏右侧的箭头时显示)。我首先将找到的代码复制粘贴到web:

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

}
#包括
#包括
#包括
#包括
#包括
#包括
void initWindow(QMainWindow*w);
int main(int argc,char*argv[])
{
Q_INIT_资源(应用程序);
QApplication应用程序(argc、argv);
qmainwin;
初始化窗口(&mainWin);
mainWin.show();
返回app.exec();
}
void initWindow(QMainWindow*w)
{
QLineEdit*搜索栏=新的QLineEdit;
QAction*newAct=newqaction(QIcon(:/images/new.png”),“&new”,w);
newAct->setShortcuts(QKeySequence::New);
QAction*openAct=新的QAction(QIcon(:/images/open.png”),“&open…”,w);
openAct->setShortcuts(QKeySequence::Open);
QAction*saveAct=新的QAction(QIcon(:/images/save.png”),“&save”,w);
saveAct->setShortcuts(QKeySequence::Save);
QAction*cutAct=新的QAction(QIcon(:/images/cut.png”),“Cu&t”,w);
cutAct->setShortcuts(QKeySequence::Cut);
QAction*copyAct=新的QAction(QIcon(:/images/copy.png”),“©”,w);
copyAct->setShortcuts(QKeySequence::Copy);
QAction*pasteAct=新的QAction(QIcon(:/images/paste.png”),“&paste”,w);
pasteAct->setShortcuts(QKeySequence::Paste);
QToolBar*fileToolBar=w->addToolBar(“文件”);
文件工具栏->添加操作(新建操作);
文件工具栏->添加操作(openAct);
文件工具栏->添加操作(保存操作);
QToolBar*editToolBar=w->addToolBar(“编辑”);
编辑工具栏->添加操作(剪切操作);
编辑工具栏->添加操作(复制操作);
编辑工具栏->添加操作(粘贴操作);
编辑工具栏->添加小部件(搜索栏);
}
…但问题是,代码仅适用于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();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
QWidget*w=新的QWidget;
QHBoxLayout*tb1=新的QHBoxLayout;
tb1->addWidget(新的QPushButton(“item11”);
tb1->addWidget(新的QPushButton(“item12”);
tb1->addWidget(新的QPushButton(“item13”);
tb1->addWidget(新的QPushButton(“item14”);
QHBoxLayout*间隔布局=新的QHBoxLayout;
间隔布局->添加间隔项(新的QSpacerItem(50,20,QSizePolicy::MinimumExpanding,QSizePolicy::Fixed));
间隔器布局->设置对齐(Qt::AlignJustify);
QWidget*sep=新的QWidget;
QRect rect=sep->geometry();
矩形设置宽度(0);
sep->setGeometry(rect);
QToolBar*tb3=新的QToolBar;
QLineEdit*搜索栏=新的QLineEdit;
QAction*item31=新的QAction(QIcon(:/images/cut.png”),“cut”);
QAction*item32=新QAction(QIcon(:/images/copy.png”),“copy”);
QAction*item33=新QAction(QIcon(:/images/open.png”),“open”);
QAction*item34=新QAction(QIcon(:/images/paste.png”),“过去”);
QAction*item35=新QAction(QIcon(:/images/save.png”),“save”);
tb3->addWidget(sep);
tb3->addWidget(搜索栏);
tb3->addAction(第31项);
tb3->addAction(第32项);
tb3->addAction(第33项);
tb3->addAction(第34项);
tb3->addAction(第35项);
QVBoxLayout*mainLayout=新的QVBoxLayout;
QHBoxLayout*topLayout=新的QHBoxLayout;
topLayout->addLayout(tb1);
topLayout->addLayout(间隔布局);
topLayout->addWidget(tb3);
QHBoxLayout*底部布局=新的QHBoxLayout;
bottomLayout->addWidget(新建QPushButton);
主布局->添加布局(topLayout);
主布局->添加布局(底部布局);
w->setLayout(主布局);
w->show();
返回app.exec();
}
以下是第二个解决方案的结果截图:我第一次启动应用程序:

当我缩小它的宽度时,右边的小部件消失了。然后我单击箭头将它们显示在下拉列表中,它们都显示出来,除了QLineEdit:


这里有人知道问题出在哪里吗?谢谢。

遗憾的是,工具栏只有在嵌入到QMainWindow中时才能正常工作。好消息是,你可以像使用小部件一样使用QMainWindow。你可以将它作为另一个小部件的父窗口,然后它就不再是一个独立的窗口。我已经这样做了,而且效果很好。我正在创建objects使用Qt设计器,我不得不删除QMainWindow菜单栏,因为设计器会自动创建它


这不是一件直观的事情,但它工作得很好,而且是一个相当简单的更改。一个好的书面注释解释了为什么您这样做,可能会受到将来阅读代码的任何人的欢迎…

遗憾的是,工具栏只有在嵌入到QMainWindow中时才能正常工作。好消息是您可以使用QMainWindow就好像它是一个小部件一样。你可以将它作为另一个小部件的父窗口,这样它就不会是一个独立的窗口。我已经这样做了,它工作得很好。我使用Qt Designer创建对象,我不得不删除QMainWindow菜单栏,因为Designer会自动创建它


这不是一个直观的操作,但它工作得很好,而且是一个相当简单的更改。一个很好的书面注释解释了为什么您这样做,可能会受到将来阅读代码的任何人的欢迎…

谢谢您的回答,我曾尝试使用QMainWindow进行测试,但它完全打乱了我工作的布局,并且因为它很复杂
#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();

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