Qt QMenu QAction, который отключен, но выглядит как включен [дубликат]

Существует метод data.table для внутреннего соединения, который очень эффективен для времени и памяти (и необходим для некоторых более крупных data.frames):

library(data.table)

dt1 <- data.table(df1, key = "CustomerId") 
dt2 <- data.table(df2, key = "CustomerId")

joined.dt1.dt.2 <- dt1[dt2]

merge также работает с данными .tables (поскольку он является общим и вызывает merge.data.table)

merge(dt1, dt2)

data.table, зарегистрированный в stackoverflow: Как выполнить операцию слияния данных.table Перевод SQL присоединяется к внешним ключам к синтаксису R data.table . Эффективные альтернативы слиянию для больших данных. Кадры R Как сделать базовое левое внешнее соединение с data.table в R?

Еще одна опция - функция join, найденная в пакете plyr

library(plyr)

join(df1, df2,
     type = "inner")

#   CustomerId Product   State
# 1          2 Toaster Alabama
# 2          4   Radio Alabama
# 3          6   Radio    Ohio

Опции для type: inner, left, right, full.

Из ?join: В отличие от merge, [join] сохраняет порядок x независимо от того, какой тип соединения используется.

6
задан Kuba Ober 25 March 2014 в 23:57
поделиться

3 ответа

Из документации QMenu:

Существует четыре типа элементов действия: разделители, действия, которые показывают подменю, виджеты и действия, выполняющие действие. Сепараторы вставлены с помощью addSeparator (), подменю с addMenu (), а все остальные элементы считаются элементами действия.

Это звонит: Виджеты! Вы можете добавить виджет в меню? Это означает, что вы улажены, вы можете делать все, что хотите.

Что вам нужно, это объект QWidgetAction . Он позволяет вставлять пользовательский виджет в качестве действия. Вашими заголовками будут пользовательские виджеты. Если вам нужен только заголовок, достаточно QLabel:

QMenu* myMenu = new QMenu(...);
QLabel* label = new QLabel(tr("<b>Title</b>"), this);
label->setAlignment(Qt::AlignCenter);

QWidgetAction* a = new QWidgetAction(myMenu);
a->setDefaultWidget(label);

- Источник для этого кода

См. Этот связанный вопрос для получения дополнительной информации сложный пример кода: Есть ли способ добавить виджет в QMenu в QtCreator

8
ответ дан Community 21 August 2018 в 22:16
поделиться

Для Qt 5.1 и выше вы должны использовать addSection(const QString &). Он разработан именно для того, что вы пытаетесь сделать. Решения на основе виджетов будут выглядеть странно, если вы не проявите особой осторожности при сопоставлении шрифтов и интервала и т. Д.

Для Qt 4 вы должны использовать addAction(const QString &) как резервную копию, если вы действительно собираетесь компилировать код с Qt 4. Я думаю, что это разумный компромисс.

Для Qt 5.0 - ну, вы больше не должны его использовать, это так просто:)

3
ответ дан Kuba Ober 21 August 2018 в 22:16
поделиться
  • 1
    Я пробовал это, но разделы показывают как простые разделители на Win7. У кого-то еще есть эта проблема? – Martin Hennings 15 October 2014 в 11:00
  • 2
    @Martin Это ошибка. Не стесняйтесь сообщать об этом, если пока нет ошибок. – Kuba Ober 15 October 2014 в 13:05
  • 3
    Это выглядит как Стиль Windows не поддерживает разделители с текстом . Используя стиль слияния Qt5.1 (добавив опцию командной строки -style fusion), отображаются тексты разделителей. – Martin Hennings 15 October 2014 в 13:07
  • 4
    @Martin Это все еще ошибка: там не так много особенностей Windows, это просто код стиля, отсутствующий в функции, Qt не зависит от самой Windows в этом отношении. Если для этого нет отчета об ошибке, я предлагаю вам файл один, по крайней мере, это позволит распознать недостающую функцию. – Kuba Ober 15 October 2014 в 14:15
  • 5
    См. Qt5.1.1, qwindowsvistastyle.cpp, l.1278: Сепараторы не украшены текстом (который будет нарисован l.1354ff), и это похоже на дизайн. – Martin Hennings 15 October 2014 в 15:15

Для всплывающего меню вы можете создать свой собственный QWidgetAction для добавления во всплывающее меню.

Это пример QWidgetAction:

#include <QWidgetAction>

class  myCustomWidgetAction: public QWidgetAction
{
    Q_OBJECT
public:
    explicit myCustomWidgetAction(QWidget * parent);

protected:
    QWidget * createWidget(QWidget *parent);

};


myCustomWidgetAction::myCustomWidgetAction(QWidget * parent):QWidgetAction(parent) {
}
QWidget * myCustomWidgetAction::createWidget(QWidget *parent){
    myCustomWidget * widget=new myCustomWidget(parent);
    return widget;
}

Затем вы можете добавить свой виджет в toolButton, который будет отображаться в всплывающем меню:

myCustomWidgetAction * widgetAction   = new myCustomWidgetAction(this);

ui->toolButton->addAction(widgetAction);

. Пользовательский виджет может быть списком, содержащим разные элементы, или может быть любым другим виджетам. Вы также можете добавить несколько экземпляров myCustomWidgetAction в toolbutton.

Вы также можете добавить его в QMenu, например:

QMenu* menu = new QMenu();

menu->addAction(widgetAction);
1
ответ дан Nejat 21 August 2018 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: