我已经创建了一个带有一堆QToolButtons的QWidget,我设法成功初始化它并使用
将其显示为一个单独的窗口myWidget.setVisible(true)
然而,我的最终目标是将此小部件添加到QToolBar以显示在我的QMainWindow的 Qt :: LeftToolBarArea 上。我使用
将 myWidget 添加到QToolBarmyToolBar.addWidget(myWidget)
QToolBar已成功添加到我的QMainWindow中(我可以看到用于在QMainWindow的不同工具栏区域移动它的句柄并可以移动它)。但是我的QWidget不可见。我试过了
myToolBar.addWidget(myWidget).setVisible(true)
由手册指定,因为除非在QAction上调用,否则 setVisible()将无效。我尝试将其他预先制作的小部件(例如QPushButton)添加到我的QToolBar中,并且可以成功地进行可视化。
我需要对我的小部件做些什么特别的事情才能让它在QToolBar中可见?
问候,
C
<<编辑>>
所以,正如我所说的,我使用qtDesigner创建了myWidget,因此我可以向您展示创建的内容并希望不会太长:
OnlineAssemblerPlayer.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>OnlineAssemblerPlayer</class>
<widget class="QWidget" name="OnlineAssemblerPlayer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>211</width>
<height>30</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QWidget" name="horizontalLayoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QToolButton" name="toolButton_2">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBox"/>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
OnlineAssemblerPlayer.h
#ifndef ONLINEASSEMBLERPLAYER_H
#define ONLINEASSEMBLERPLAYER_H
#include <QWidget>
namespace Ui {
class OnlineAssemblerPlayer;
}
class OnlineAssemblerPlayer : public QWidget
{
Q_OBJECT
public:
explicit OnlineAssemblerPlayer(QWidget *parent = 0);
~OnlineAssemblerPlayer();
private:
Ui::OnlineAssemblerPlayer *ui;
};
#endif // ONLINEASSEMBLERPLAYER_H
OnlineAssemblerPlayer.cc
#include "OnlineAssemblerPlayer.h"
#include "ui_OnlineAssemblerPlayer.h"
OnlineAssemblerPlayer::OnlineAssemblerPlayer(QWidget *parent) :
QWidget(parent),
ui(new Ui::OnlineAssemblerPlayer)
{
ui->setupUi(this);
}
OnlineAssemblerPlayer::~OnlineAssemblerPlayer()
{
delete ui;
}
由Qt生成的* ui_OnlineAssemblerPlayer.h *
/********************************************************************************
** Form generated from reading UI file 'OnlineAssemblerPlayer.ui'
**
** Created: Wed Jul 4 16:23:39 2012
** by: Qt User Interface Compiler version 4.8.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_ONLINEASSEMBLERPLAYER_H
#define UI_ONLINEASSEMBLERPLAYER_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QComboBox>
#include <QtGui/QHBoxLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QToolButton>
#include <QtGui/QWidget>
QT_BEGIN_NAMESPACE
class Ui_OnlineAssemblerPlayer
{
public:
QWidget *horizontalLayoutWidget;
QHBoxLayout *horizontalLayout;
QToolButton *toolButton_2;
QToolButton *toolButton;
QComboBox *comboBox;
void setupUi(QWidget *OnlineAssemblerPlayer)
{
if (OnlineAssemblerPlayer->objectName().isEmpty())
OnlineAssemblerPlayer->setObjectName(QString::fromUtf8("OnlineAssemblerPlayer"));
OnlineAssemblerPlayer->resize(211, 30);
horizontalLayoutWidget = new QWidget(OnlineAssemblerPlayer);
horizontalLayoutWidget->setObjectName(QString::fromUtf8("horizontalLayoutWidget"));
horizontalLayoutWidget->setGeometry(QRect(0, 0, 211, 31));
horizontalLayout = new QHBoxLayout(horizontalLayoutWidget);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
horizontalLayout->setContentsMargins(0, 0, 0, 0);
toolButton_2 = new QToolButton(horizontalLayoutWidget);
toolButton_2->setObjectName(QString::fromUtf8("toolButton_2"));
horizontalLayout->addWidget(toolButton_2);
toolButton = new QToolButton(horizontalLayoutWidget);
toolButton->setObjectName(QString::fromUtf8("toolButton"));
horizontalLayout->addWidget(toolButton);
comboBox = new QComboBox(horizontalLayoutWidget);
comboBox->setObjectName(QString::fromUtf8("comboBox"));
horizontalLayout->addWidget(comboBox);
retranslateUi(OnlineAssemblerPlayer);
QMetaObject::connectSlotsByName(OnlineAssemblerPlayer);
} // setupUi
void retranslateUi(QWidget *OnlineAssemblerPlayer)
{
OnlineAssemblerPlayer->setWindowTitle(QApplication::translate("OnlineAssemblerPlayer", "Form", 0, QApplication::UnicodeUTF8));
toolButton_2->setText(QApplication::translate("OnlineAssemblerPlayer", "...", 0, QApplication::UnicodeUTF8));
toolButton->setText(QApplication::translate("OnlineAssemblerPlayer", "...", 0, QApplication::UnicodeUTF8));
} // retranslateUi
};
namespace Ui {
class OnlineAssemblerPlayer: public Ui_OnlineAssemblerPlayer {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_ONLINEASSEMBLERPLAYER_H
然后我在QMainWindow的构造函数中初始化它,如下所示:
OnlineAssemblerPlayer *mOnlineAssemblerPlayer = new OnlineAssemblerPlayer;
QToolBar *mToolbarAssemblerPlayer = new QToolBar(tr("AssemblerPlayer"));
mToolbarAssemblerPlayer->addWidget(mOnlineAssemblerPlayer);
mToolbarAssemblerPlayer->setMovable(true);
mToolbarAssemblerPlayer->setAllowedAreas(Qt::AllToolBarAreas);
addToolBar(Qt::LeftToolBarArea, mToolbarAssemblerPlayer);
答案 0 :(得分:1)
您不必设置工具栏的可见性。您确定要向窗口小部件添加任何内容吗?我几乎可以肯定你没有设置任何小部件外观。您能向我们展示“myWidget”的代码以及将小部件添加到工具栏的更多内容吗?
修改
尝试添加
setLayout(ui->horizontalLayout);
之后
retranslateUi(OnlineAssemblerPlayer);
答案 1 :(得分:0)
我偶然发现了类似的问题:创建了一个自定义小部件(QWidget
子类,其成员为QListView
),并尝试将其添加到QToolBar
的{{1}}。尽管成功地为QMainWindow
重新定位,但无论我做了什么都没有出现。虽然简单的默认小部件(按钮,短信,甚至列表视图)都可见并且运行良好。
我最终没有让它发挥作用,但我发现QToolBar
实际上不是使用QToolBar
而是使用QWidgets
:甚至通过addWidget(wgt *)添加小部件只添加一些与wgt连接的QAction。
现在似乎合乎逻辑的是,添加由QButton等一些默认小部件组成的自定义小部件,QToolBar只是不知道如何显示它。据我所知,它是通过 QActions
解决的,这是为了向QWidgetAction
,QToolBar
等添加自定义窗口小部件功能而实现的 - 所有使用{{1} }。 QMenu
的虚拟函数QActions
和QWidgetAction
为此目标服务。
但在我的情况下,我避免了这个问题:不是从createWidget(QWidget*)
继承,而是在其中添加deleteWidget(QWidget*)
,但直接来自QWidget
。这样我可以使用QListView
自由地将其添加到工具栏中。