2013-09-01 2 views
1

Я понял, что QToolButton работает иначе при добавлении к QToolBar по сравнению с тем, как он ведет себя при добавлении к компоновке в QFrame/QWidget.QToolButton визуальное поведение внутри QFrame/QWidget

вариант Какой стиль мне нужно установить на QToolButton, поэтому она ведет себя внутри QFrame точно так же, как это было бы (визуально) внутри QToolBar?

Моя нынешняя платформа - OS X, эта разница в поведении одинакова на Qt 4.8 и 5.1 (по моим тестам).

Спасибо

Пример:

QToolButton behavior difference

код, используемый для создания ниже сценария:

int main(int argc, char **argv) 
{ 
    QApplication app(argc,argv); 

    QMainWindow* window = new QMainWindow(); 
    QWidget* centralWidget = new QWidget(); 
    QVBoxLayout* layout = new QVBoxLayout(); 

    centralWidget->setLayout(layout); 
    window->setCentralWidget(centralWidget); 
    window->setWindowTitle("QToolButton inside QToolBar vs QFrame/QWidget"); 

    layout->setContentsMargins(0, 0, 0, 0); 
    layout->setSpacing(30); 

    QToolBar* toolBar = new QToolBar(); 
    toolBar->setOrientation(Qt::Horizontal); 
    layout->addWidget(toolBar); 

    QToolButton* button_1 = new QToolButton(); 
    button_1->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 
    button_1->setIcon(QPixmap(":/icons/icons/1.png")); 
    button_1->setIconSize(QSize(32, 32)); 
    button_1->setText("Button 1"); 
    toolBar->addWidget(button_1); 

    QToolButton* button_2 = new QToolButton(); 
    button_2->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 
    button_2->setIcon(QPixmap(":/icons/icons/2.png")); 
    button_2->setIconSize(QSize(32, 32)); 
    button_2->setText("Button 2"); 
    toolBar->addWidget(button_2); 

    QToolButton* button_3 = new QToolButton(); 
    button_3->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 
    button_3->setIcon(QPixmap(":/icons/icons/3.png")); 
    button_3->setIconSize(QSize(32, 32)); 
    button_3->setText("Button 3"); 
    // toolBar->addWidget(button_3); 

    QToolButton* button_4 = new QToolButton(); 
    button_4->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 
    button_4->setIcon(QPixmap(":/icons/icons/4.png")); 
    button_4->setIconSize(QSize(32, 32)); 
    button_4->setText("Button 4"); 
    // toolBar->addWidget(button_4); 

    QFrame* frame  = new QFrame(); 
    frame->setStyleSheet("QFrame { background: #ff0; }"); 
    layout->addWidget(frame); 

    QHBoxLayout* frame_layout = new QHBoxLayout(); 
    frame_layout->setContentsMargins(0, 0, 0, 0); 
    frame_layout->setSpacing(0); 
    frame->setLayout(frame_layout); 

    frame_layout->addWidget(button_4); 
    frame_layout->addWidget(button_3); 
    // button_4->animateClick(10000); 
    frame_layout->addStretch(); 

    window->show(); 
    return app.exec(); 
} 
+0

В чем разница, которую вы заметили? Какую версию Qt вы используете? Можете ли вы включить фрагмент кода? – mhcuervo

+0

@mhcuervo, см. Добавленное изображение и пояснения. Я не вводил никакого кода, поскольку он состоит из создания 4 кнопок, панели инструментов и рамки и их добавления. Но я скажу также. – Phil

ответ

0

То, что вы видите желателен поведение и является когерентным с визуальным поведением другого Насколько я могу судить, приложения OS X. Возможно, вам захочется переосмыслить, целесообразно ли вам то, что вам нужно. Если вы придумаете вескую причину, я буду смотреть дальше.

+0

Здравствуйте @KubaOber, спасибо за ваш ответ. Я работаю над настраиваемым QFrame, чтобы функционировать и использоваться так же, как QToolBar. Однако я не хочу унаследовать от QToolBar и реализовать его сам. Одна из вещей, которые я желаю, и должен иметь больше всего, - это поведение QToolButton (или QWidget), добавленное к этому настраиваемому ToolBar. Я хочу, чтобы эффект тени был затенен на иконку на mousePress. Так что мне очень любопытно, как нужно настраивать QToolbutton для того, чтобы он так себя вел? Или что делать с QLabel, показывая изображение для его затенения на mousePress? – Phil

+0

Хорошо, я посмотрю, что я могу придумать. –

+0

Спасибо. До сих пор я решил решение, но я думаю, что я изобретаю колесо -> Создать значок QImage с одинаковым размером, тип ARGB32. Создайте QColor. Значок сканирования по оси x и оси y, установите QColor на цвет каждого пикселя. Сделайте цвет темнее на 200 через функцию темного члена QColor. На тех же командах частного QImage установите этот цвет и сохраните его в памяти. На mousePress замените Pixmap QLabel на изображение с помощью этого, верните исходный желаемый значок на mouseRelease. И это работает по желанию, но я все же думаю, что должен быть «один лайнер», чтобы QToolButton вел себя одинаково. – Phil

Смежные вопросы