editMenu->insertItem(tr("F&ind Again\t[Shift]Ctrl+G"));
Если вы используете QAction, то должны написать так:
findAgainAct->setMenuText(tr("F&ind Again\t[Shift]Ctrl+G"));
Основная идея реализации задаваемых таким образом "горячих" клавиш заключается в том, что вместо использования классов QAccel или QAction вы должны переопределить метод QWidget::keyEvent().
Я использую Qt на устройстве с сенсорным экраном. Как изменить ширину вертикальных полос прокрутки и высоту горизонтальных полос прокрутки, чтобы стало удобнее пользоваться виджетом QListBox?
Попробуйте воспользоваться функцией QApplication::setGlobalStrut(). Она задает минимальный размер QSize для всех GUI-элементов. Например, после следующего вызова:
QApplication::setGlobalStrut(QSize(30, 30));
ширина ваших вертикальных полос прокрутки и высота горизонтальных полос прокрутки станут равны, как минимум, 30 пикселам. Также вызов этой функции приведет к изменению размеров других GUI-элементов: кнопок, строк меню и элементов списка.
void MyStyle::drawPrimitive(PrimitiveElement element, QPainter *painter, const QRect &rect, const QColorGroup &colorGroup, SFlags flags, const QStyleOption &opt) const { if (element == PE_HeaderSection) { // код отрисовки } else QWindowsStyle::drawPrimitive(element, painter, rect, colorGroup, flags, opt); }
bool MyTable::eventFilter(QObject *targetObj, QEvent *event) { if (targetObj == (QObject *)horizontalHeader() && event->type() == QEvent::Paint) { QPainter painter(horizontalHeader()); // код отрисовки return true; } else return QTable::eventFilter(targetObj, event); }
int MyStyle::pixelMetric(PixelMetric metric, const QWidget *widget) const { if (metric == PM_SplitterWidth) { return 6; } else { return QWindowsStyle::pixelMetric(metric, widget); } }
class ProxyStyle : public QStyle { public: ProxyStyle(const QString &baseStyle) { style = QStyleFactory::create(baseStyle); } void polish(QWidget *w) { style->polish(w); } void unPolish(QWidget *w) { style->unPolish(w); } int pixelMetric(PixelMetric metric, QWidget *widget) const { return style->pixelMetric(metric, widget); } ... private: QStyle *style; };
class MyStyle : public ProxyStyle { public: MyStyle(const QString &baseStyle); int pixelMetric(PixelMetric metric, const QWidget *widget) const; }; int MyStyle::pixelMetric(PixelMetric metric, const QWidget *widget) const { if (metric == PM_SplitterWidth) return 6; return ProxyStyle::pixelMetric(metric, widget); }
int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setStyle(new MyStyle(app.style().name())); ... return app.exec(); }
Таким образом, прокси-техника в некоторой степени компенсирует ограничения языка: в C++ можно наследовать только от классов, а не от объектов. Подробнее прокси-классы рассмотрены в Design Patterns (ISBN 0-201-63361-2). При использовании прокси-классов нужно помнить об одной тонкости. Некоторые виртуальные функции стандартных стилей Qt реализованы посредством других виртуальных функций, например, метод QWindowsStyle::drawComplexControl() для отрисовки стрелочек виджета QComboBox вызывает метод QWindowsStyle::drawPrimitive(). Если в классе MyStyle (который унаследован от ProxyStyle) вы переопределите метод drawPrimitive(), то он будет проигнорирован в классе QWindowsStyle, так как последний будет использовать свою функцию drawPrimitive(). (Это объясняется тем, что MyStyle не наследует QWindowsStyle, а лишь включает его.) В зависимости от того, какой именно виджет вы захотите изменить, вам также может понадобиться переопределить метод drawComplexControl(). У меня проблема со стилем Windows XP. При настройке палитры и выборе зеленого цвета для компоненты Button не происходит смена цвета кнопки QPushButton. Но в то же время смена цвета осуществляется корректно после смены текущей темы Windows на "Windows Classic". Как это исправить? Это ошибка в стиле? Стиль Windows XP в Qt использует Windows-механизм тем. Для отрисовки кнопок и других компонентов тема XP использует изображения, игнорируя при этом цвета палитры. Такое поведение "зашито" в код Windows XP, и Qt здесь бессильна. (В Mac OS X наблюдается такая же проблема со стилем Mac.)