2010-10-12 195 views
4

Qt3用於提供帶有QWidget *參數的QMenuBar :: insertItem。這樣任何自定義小部件都可以添加到菜單欄 - 例如時鐘小部件。 在Qt4中沒有這樣的重載方法。達到相同目標的最佳方式是什麼 - 將自定義小部件添加到菜單欄?自定義小部件應該集成在菜單欄的佈局中。 Anyoune是否知道背景,爲什麼在Qt4 API中刪除了insertItem的重載?向QMenuBar添加自定義小部件

此致敬禮。

回答

3

對不起哈維爾的簡短評論。每次我打算斷行,有人評論:-(

提交我試圖與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

+2

你真的應該添加額外的信息作爲你的原始問題的編輯,但我們學習,當我們去對嗎? :)此解決方案應該可以工作,但是您應該在createWidget()而不是requestWidget()的重寫中創建您的小部件。 requestWidget()不是虛擬的。 – 2010-10-12 21:49:19

+0

謝謝!不幸的是它仍然不適用於MenuBar。 QMenuBar根本不想接受自定義小部件:-(然而,它適用於子菜單,例如ui-> menuFile-> addAction(mwa);作品。我的自定義按鈕出現在文件菜單中。 – 2010-10-13 13:23:28

+0

@ValentinHeinitz做過你了有沒有想過一個解決這個問題的方法?你能夠在QMenuBar中添加一個小部件嗎? – 2016-01-20 18:33:28

8

有一個QMenuBar::addAction (QAction * action)方法,將任意QAction添加到菜單欄。
例如,它可以是QWidgetAction,它是QAction的子類,具有關聯的QWidget而不是僅圖標+文本。

+0

非常感謝您的回答,哈維爾。 – 2010-10-12 18:20:30

+0

不幸的是它不起作用:-) – 2010-10-12 18:23:51

+1

好吧,現在我已經得到它了。這是一個錯誤,addAction是QWidgets的方法,並沒有特別用QMenuBar做任何事情。未指定將QWidgetAction添加到QMenuBar。該操作已添加,但小部件將被忽略。然而,QMenu重載addAction,並將QWidgets顯示爲菜單項。我很害怕,我必須實現我的菜單欄並使用setMenuBarWidget將它添加到應用程序中。 – 2010-10-20 14:31:25

1

我只能通過增加我的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上不起作用。

+0

謝謝你提供MAC的信息,有趣! – 2011-04-18 09:24:38

相關問題