Qt3用於提供帶有QWidget *參數的QMenuBar :: insertItem。這樣任何自定義小部件都可以添加到菜單欄 - 例如時鐘小部件。 在Qt4中沒有這樣的重載方法。達到相同目標的最佳方式是什麼 - 將自定義小部件添加到菜單欄?自定義小部件應該集成在菜單欄的佈局中。 Anyoune是否知道背景,爲什麼在Qt4 API中刪除了insertItem的重載?向QMenuBar添加自定義小部件
此致敬禮。
Qt3用於提供帶有QWidget *參數的QMenuBar :: insertItem。這樣任何自定義小部件都可以添加到菜單欄 - 例如時鐘小部件。 在Qt4中沒有這樣的重載方法。達到相同目標的最佳方式是什麼 - 將自定義小部件添加到菜單欄?自定義小部件應該集成在菜單欄的佈局中。 Anyoune是否知道背景,爲什麼在Qt4 API中刪除了insertItem的重載?向QMenuBar添加自定義小部件
此致敬禮。
對不起哈維爾的簡短評論。每次我打算斷行,有人評論:-(
提交我試圖與QtCreator創建了一個項目這樣的代碼:
class MyWidgetAction : public QWidgetAction
{
public:
MyWidgetAction(QObject * parent) :QWidgetAction ( parent)
{
}
void releaseWidget (QWidget * widget)
{
widget->deleteLater();
}
QWidget * requestWidget (QWidget * parent)
{
QPushButton *b = new QPushButton(tr("MyWidget"), parent);
b->show();
return b;
}
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QAction *a = new QAction(tr("TestAction"),this); //1
QWidgetAction * wa = new QWidgetAction(this); //2
wa->setDefaultWidget(new QPushButton("Default"));
MyWidgetAction *mwa = new MyWidgetAction(this); //3
ui->menuBar->addAction(a); //1 - works. TestAction added to menu bar
ui->menuBar->addAction(wa); //2 - noop. nothing added to menu bar
ui->menuBar->addAction(mwa); //3 - noop. nothing added to menu bar
}
只有加入的QAction(1)工作既不增加QWidgetAction用。我已經在C-Tor和MyWidgetAction的兩個虛擬函數中設置了斷點,令人驚訝的是,只有C-Tor斷點被打了出來 我在Windows上用Open-Source,MinGW Qt4.6.3的版本 難道是Qt中的一個bug? 非常感謝您提前給出任何建議!
個問候, 瓦倫丁Heinitz
有一個QMenuBar::addAction (QAction * action)
方法,將任意QAction
添加到菜單欄。
例如,它可以是QWidgetAction
,它是QAction
的子類,具有關聯的QWidget
而不是僅圖標+文本。
非常感謝您的回答,哈維爾。 – 2010-10-12 18:20:30
不幸的是它不起作用:-) – 2010-10-12 18:23:51
好吧,現在我已經得到它了。這是一個錯誤,addAction是QWidgets的方法,並沒有特別用QMenuBar做任何事情。未指定將QWidgetAction添加到QMenuBar。該操作已添加,但小部件將被忽略。然而,QMenu重載addAction,並將QWidgets顯示爲菜單項。我很害怕,我必須實現我的菜單欄並使用setMenuBarWidget將它添加到應用程序中。 – 2010-10-20 14:31:25
我只能通過增加我的QMenuBar
和自定義窗口小部件,新QWidget
,並使用要做到這一點,作爲菜單欄:
MenuWidget::MenuWidget(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
QWidget *w = new QWidget(this);
QHBoxLayout *layout = new QHBoxLayout(w);
layout->addWidget(ui.menuBar);
QLineEdit *edit = new QLineEdit("", w);
layout->addWidget(edit);
layout->addStretch(10);
setMenuWidget(w);
}
這適用於Windows,但它在Mac上不起作用。
謝謝你提供MAC的信息,有趣! – 2011-04-18 09:24:38
你真的應該添加額外的信息作爲你的原始問題的編輯,但我們學習,當我們去對嗎? :)此解決方案應該可以工作,但是您應該在createWidget()而不是requestWidget()的重寫中創建您的小部件。 requestWidget()不是虛擬的。 – 2010-10-12 21:49:19
謝謝!不幸的是它仍然不適用於MenuBar。 QMenuBar根本不想接受自定義小部件:-(然而,它適用於子菜單,例如ui-> menuFile-> addAction(mwa);作品。我的自定義按鈕出現在文件菜單中。 – 2010-10-13 13:23:28
@ValentinHeinitz做過你了有沒有想過一個解決這個問題的方法?你能夠在QMenuBar中添加一個小部件嗎? – 2016-01-20 18:33:28