Добавление пользовательских виджетов в QMenuBar - PullRequest
4 голосов
/ 12 октября 2010

Qt3 используется для предоставления QMenuBar :: insertItem с параметром QWidget *.Таким образом, любой произвольный виджет может быть добавлен в строку меню - например, виджет часов.В Qt4 такого перегруженного метода нет.Как лучше всего достичь той же цели - добавить пользовательские виджеты в строку меню?Пользовательские виджеты должны быть интегрированы в макет строки меню.Кто-нибудь знает фон, почему эта перегрузка insertItem была удалена в Qt4 API?

С наилучшими пожеланиями.

Ответы [ 3 ]

8 голосов
/ 12 октября 2010

есть метод QMenuBar::addAction ( QAction * action ) для добавления произвольного QAction к строке меню.
Например, это может быть QWidgetAction, который является подклассом QAction со связанным QWidgetвместо просто иконки + текст.

3 голосов
/ 12 октября 2010

Извините, Хавьер за короткие комментарии. Каждый раз, когда я намеревался разбить строку, комментарий был представлен: - (

Я пробовал этот код в проекте, созданном с помощью 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 с виджетом по умолчанию без наследования QWidgetAction не дало результата. Я установил точки останова в C-Tor и обе виртуальные функции MyWidgetAction. Удивительно, но была достигнута только точка останова C-Tor. Я пробовал на Windows с открытым исходным кодом, MinGW версия Qt4.6.3 Может ли это быть ошибкой в ​​Qt? Заранее большое спасибо за любые предложения!

С уважением, Валентин Хайниц

1 голос
/ 31 января 2011

Я смог сделать это только добавив мой QMenuBar и пользовательский виджет в новый QWidget и используя TH в качестве строки меню:

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.

...