2015-02-26 9 views
2

Мне нужно создать значок pixmap, два метода, с которыми я знаком, чтобы сделать это: один настраивает pixmap как o QLabel и отображает его, а другой рисует pixmap с помощью QPainter, т.е.QPainter или QLabel менее дорогостоящий, чтобы нарисовать QPixmap

Метод один

Icon::Icon 
{ 
    QLabel iconLab = new QLabel; 
    QLabel iconName = new QLabel; 
    iconLab->setPixmap("mypixmap.png"); 
    iconName->setText("myiconname"); 
    QVBoxLayout *iconLayout = new QVBoxLayout; 
    iconLayout->setMargin(0); 
    iconLayout->addWidget(iconLab, 1, Qt::AlignCenter); 
    iconLayout->addWidget(iconName, 1, Qt::AlignCenter); 
    iconLayout->setSpacing(0); 

    setLayout(iconLayout); 
    setMaximumSize(100,160); 
    setMinimumSize(100,160); 
} 

Способ 2,

Icon::Icon 
{  
    setMaximumSize(100,160); 
    setMinimumSize(100,160); 
} 
Icon::paintEvent(QPaintEvent*) 
{  
    QPainter painter; 
    painter.drawPixmap(0,0,myPixmap); 
    painter.drawText(0,100,myText) 
} 

Я должен обратить количество иконок, более чем на 100, таким образом, какой из них эфф ective, Заранее спасибо,

+1

Вы потрудились профилировать их и узнать? – cmannett85

+0

прямо сейчас я использую первый метод. Потому что я не очень хорошо знаком с QPainter. Я прочитал, что рисование с использованием paintEvent уменьшит скорость, так как оно будет выполняться всякий раз, когда приходит запрос на обновление экрана. –

ответ

4

С теоретической точки зрения подход QPainter будет быстрее, потому что издержки, введенные QLabel, исключаются. Внутренне QLabel также должен использовать QPainter (используя drawPicture()).

Однако сомнительно, если эта разница сделает ваше приложение более отзывчивым. Я сомневаюсь, что эта оптимизация будет даже заметна.

Я бы рекомендовал позаботиться о читаемости кода в первую очередь и принять то, что легче/лучше использовать.

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

+1

«С теоретической точки зрения» - и практически тоже! – TheDarkKnight

+0

Практически QLabel выполняет некоторое кэширование и использует другой метод, чем тот, который приведен в примере (drawPixmap vs drawPicture). На практике это будет зависеть от реализации и использования QPainter (масштабирование и т. Д.), Если оно выполняется быстрее. Я уверен, что есть возможность реализовать подход на основе QPainter, который медленнее QLabel. –

1

Если вам нужно нарисовать более 100, это обычно означает, что вы не должны использовать какие-либо из этих решений.
Скорее всего, QListView с пользовательским делегатом и QAbstractListModel для хранения этих изображений - это то, что вам действительно нужно (или табличная версия).

+0

Я создаю Icon, нет сгенерированного значка, только QPixmap и QText у меня есть –