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