Как реализовать меню “Edit” с “Отменой”, “Сокращением”, “Вставкой” и “Копией”?

Поздравления,

для одного из моих приложений я пытаюсь реализовать меню "Edit". Это меню обычно имеет Отмену стандартных записей, Сокращение, Копию и Вставку.

Это меню не там по умолчанию, и пользователи, кажется, ожидают это особенно на Mac OS X.

Существует ли более легкий способ реализовать это, не делая так в каждом виджете вручную? Так как большинство виджетов имеет механизм копии/вставки/отмены, уже реализованный через ярлыки, я хотел бы обеспечить несколько простых действий меню, которые называют их также.

Действия должны звонить, любой виджет имеет фокус сначала, затем они должны передать события вверх объектная цепочка, я предполагаю.

Я использую Qt 4.6 в Windows, Linux и Mac OS X.

Спасибо!

8
задан BastiBen 12 January 2010 в 07:52
поделиться

2 ответа

Достаточно просто выполнить половину необходимой функциональности. Просто создайте меню «Правка» вместе с необходимыми действиями QActions (копирование / вставка / отмена / и т. Д.) В классе главного окна и подключите их к слотам. В слотах эмулируйте правильные события нажатия и отпускания клавиш (например, Ctrl + C для копирования) и отправляйте их в текущий виджет с фокусом. В коде примерно так:

MainWindow::MainWindow(...)
{
    ...
    connect( actionCopy, SIGNAL( triggered()), SLOT( copy()));
    ...
}
...
void MainWindow::copy()
{
    QWidget* focused = QApplication::focusWidget();
    if( focused != 0 )
    {
        QApplication::postEvent( focused,
                                 new QKeyEvent( QEvent::KeyPress,
                                                Qt::Key_C,
                                                Qt::ControlModifier ));
        QApplication::postEvent( focused,
                                 new QKeyEvent( QEvent::KeyRelease,
                                                Qt::Key_C,
                                                Qt::ControlModifier ));
}

Конечно, это настоящий взлом. Вам нужно изменить код для каждой целевой платформы, изменив сочетания клавиш на правильные, и может случиться так, что виджет, который получает фокус, сделает что-то тихое неожиданное с помощью Ctrl + C. На мой взгляд, худшим недостатком этого метода является то, что вы не можете должным образом контролировать включенное состояние пунктов меню «Правка». Из общего виджета невозможно запросить, возможна ли операция копирования или вставки.

Я не могу найти реальное решение этой проблемы - и был бы удивлен, если бы обнаружил, что оно существует, - поскольку функция копирования / вставки обычно скрыта внутри кода класса и не предоставляется ни одним стандартным набором сигналов / слоты. После сегодняшних экспериментов с функциональностью я решил просто забыть о меню «Правка» в моем приложении и ожидать, что пользователи будут знать сочетания клавиш или использовать контекстно-зависимые меню.

6
ответ дан 5 December 2019 в 22:18
поделиться

После прочтения вашего разъяснения у меня сложилось впечатление, что вы действительно хотите запросить таблицы, находящиеся в двух отдельных экземплярах MySQL сервера. По крайней мере, ваш текст пояснения:

SELECT foreign_db.login.username, firstname, lastname от foreign_db.login, user где

предлагает выполнить один запрос при входе в систему как два пользователя (которые могут находиться или не находиться на одном экземпляре сервера mysql).

В вашем вопросе вы сказали, что хотите запросить данные из двух разных баз данных, но важно понимать, что один экземпляр MySQL может иметь много-много баз данных. Для нескольких баз данных, управляемых одним экземпляром mysql, решение, предложенное в вопросе, на который вы ссылаетесь, просто работает: просто префиксируйте имя таблицы с именем баз данных, разделяя имена базы данных и таблицы точкой: < имя _ базы _ данных >. < имя _ таблицы > .

Но, как я уже отмечал, это работает только в том случае, если

  1. все базы данных, к которым вы обращаетесь в одном запросе, находятся на одном сервере, т.е. управляются одним и тем же экземпляром MySQL
  2. , пользователь, подключенный к базе данных, имеет право доступа к обеим таблицам.

Scenario1: базы данных на одном хосте: предоставить соответствующие привилегии и квалифицировать имена таблиц

Поэтому, если таблицы фактически находятся в одном экземпляре mysql, нет необходимости во втором входе или подключении - просто предоставьте пользователю базы данных, который используется для подключения к базе данных, соответствующие привилегии для выбора из всех необходимых таблиц. Это можно сделать с помощью синтаксиса GRANT , описанного здесь: http://dev.mysql.com/doc/refman/5.1/en/grant.html

Например, GRANT SELECT ON sakila.film TO 'test' @ '%' позволит пользователю test @% выбрать данные из таблицы film в базе данных sakila . После этого пользователь может обратиться к этой таблице, используя sakila.film (так называемое квалифицированное имя таблицы), или если в текущей базе данных установлено значение sakila , просто как фильм

Scenario2: базы данных, управляемые различными экземплярами MySQL: FEDERATED engine

Если таблицы, к которым вы хотите получить доступ, фактически управляются двумя различными экземплярами MySQL, есть один трюк, который может работать или не работать, в зависимости от вашей конфигурации. Поскольку MySQL 5,0 mysql поддерживает механизм FEDERATED места хранения. Это позволяет создать таблицу, которая фактически является не таблицей, а peephole к таблице на удаленном сервере. Этот механизм документирован здесь: http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html

Например, если вы знаете, что в базе данных misc на удаленном хосте есть эта таблица:

CREATE TABLE t (
    id int not null primary key
,   name varchar(10) not null unique
)

вы можете сделать локальный «указатель» на эту удаленную таблицу, используя эту:

CREATE TABLE t (
    id int not null primary key
,   name varchar(10) not null unique
)
ENGINE = FEDERATED
CONNECTION='mysql://<user>@<remote-server>:<remote-port>/misc/t';

К сожалению, механизм FEDERATED не всегда доступен, поэтому вам необходимо сначала проверить, можно ли даже использовать ее. Но предположим, что это так, тогда вы можете просто использовать локальную таблицу t в своих запросах, как и любую другую таблицу,MySQL будет взаимодействовать с удаленным сервером и выполнять соответствующие операции над физической таблицей на другой стороне.

Предупреждение: имеется несколько проблем оптимизации с таблицами FEDERATED. Вы должны выяснить, если и в какой степени они применимы к вам. Например, применение WHERE к федеративной таблице во многих случаях может привести к тому, что все содержимое таблицы будет перенесено по проводу на локальный сервер, где будет применена фактическая фильтрация. Другая проблема связана с созданием таблицы: необходимо быть очень уверенным, что определения федеративной таблицы и таблицы, на которую она указывает, совпадают точно, за исключением предложения ENGINE (и CONNECTION). Если, например, имеется другой набор символов, данные могут поступать полностью искаженными после прохождения по проводу.

Если требуется использовать таблицы FEDERATED , прочтите эту статью http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html , чтобы определить, подходит ли она для конкретного варианта использования.

Если вы думаете, что вам это нужно, у меня есть утилита для создания федеративных таблиц здесь: http://forge.mysql.com/tools/tool.php?id=54

Scenario3: не может использовать ФЕДЕРАТИВНЫЕ, но таблицы на разных экземплярах MySQL

Наконец, если у вас есть таблицы на разных экземплярах MySQL, но не может по какой-то причине использовать федеративный обработчик таблиц, вашей удачи я боюсь. Вам просто придется выполнять запросы к обоим экземплярам MySQL, получать результаты и делать что-то интеллектуальное с ним в PHP. В зависимости от ваших точных требований, это может быть вполне жизнеспособным решением

Я думаю, вам нужно решить для себя, какая часть моего ответа лучше всего взывает к вашей проблеме, и добавить комментарий на случай, если вам понадобится дополнительная помощь. ТИА Роланд.

-121--3067659-

Просмотрите галерею matplotlib , где все графики имеют свой исходный код. Найдите то, что вам нравится, вырезать и вставить, рассечь!

-121--4746540-

У меня сложилось впечатление, что меню «Правка» применяется к центральному виджету документа, а не к загрузке небольших. Я не тестировал, но если у вас есть форма с QLineEdits, действительно ли меню Правка (в строке меню) применимо к этому виджету. Разве вы не просто вызвать контекстное меню или нажать короткие сокращения, чтобы получить доступ к этим параметрам...

0
ответ дан 5 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

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