PyQt5: Получение координат мыши из QLabel [duplicate]

Vayn,

Geekoaur ответил на ваш вопрос хорошо, я просто указываю еще одну «проблему» с вашим кодом.

Строка s1 [strlen (s1)] = '\ 0'; является no-op , если s1 уже полностью нулевое завершение до того, как оно выполняется.

Но если s1 NOT allready должным образом завершен нулем до того, как эта строка выполняется (и вам не повезло), это приведет к:

Это потому, что strlen basicaly находит индекс существующего нуль-терминатора и возвращает его! Вот действительная, неоптимизированная реализация strlen:

  int strlen (char * string) {int i = 0;  while (string [i]! = '\ 0') {++ i;  } return i;  }  

Итак ... Если вы ДЕЙСТВИТЕЛЬНО беспокоитесь о том, что строки НЕ были завершены нулями, вы сделали бы что-то вроде:

  • string [sizeof (string)] = '\ 0'; на локальных автоматических строках (где компилятор «знает» размер строки);
  • или [SIZE_OF_STRING] для всех остальных строк, где SIZE_OF_STRING (чаще всего) a #define 'd константа или переменная, которую вы поддерживаете специально для хранения текущего SIZE (не длина) динамически выделенной строки.

И если вы ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО беспокоитесь о строках, (например, вы используете «грязные» методы libary (например, ATMI Tuxedo), вы также «очищаете» свои «строки возврата» перед передачей их методам подозрительной библиотеки с помощью:

  • before: memset (string, NULL, SIZE_OF_STRING);
  • invoke: DirtyFunction (/ * out * / string) ;
  • после: string [SIZE_OF_STRING] = '\ 0' [! ​​d15]

SIG11 - это полная привязка для поиска, потому что (если вы не «зацепите» их с помощью signal-processor и сказать иначе, они заставляют unix жестко завершать вашу программу, поэтому вы не можете ничего записывать (после факта), чтобы помочь выяснить, here-in-the-hell-do-that-come-from ... особенно учитывая, что во многих случаях строка кода, которая выбрасывает SIG11, не находится рядом с фактической причиной того, что строка теряет нулевой ограничитель.

Разве это имеет для вас смысл?

Cheers mate. Keith.

PS: ПРЕДУПРЕЖДЕНИЕ: strncpy НЕ все пустил нуль ... вы, вероятно, имели в виду strlcpy . Я узнал об этом трудным образом ... когда сработал биллинг на 60 миллионов долларов.


EDIT:

FYI: Вот «безопасная» (неоптимизированная) версия strlen который я назову strnlen (я считаю, что это должно быть в stdlib . Sigh.).

  // перенастраивает длину  string (capped at size-1) int strnlen (char * string, int size) {int i = 0;  while (i & lt; size & amp; & amp; string [i]! = '\ 0') {++ i;  } return i;  }  

3
задан ralphtheninja 1 June 2011 в 18:26
поделиться

3 ответа

Сначала вы должны нарисовать изображение. Вы можете сделать это, создав виджет QLabel и позвонив setPixmap. Прежде чем делать это, вам нужно преобразовать QImage в QPixmap (вы можете использовать QPixmap.fromImage(img)).

Вы можете получить щелчки мыши, выполнив подкласс QImage и перехватив mousePressEvent. Посмотрите значение пикселя с помощью QImage.pixel().

1
ответ дан NorthCat 17 August 2018 в 11:24
поделиться
self.image = QLabel()
self.image.setPixmap(QPixmap("C:\\myImg.jpg"))
self.image.setObjectName("image")
self.image.mousePressEvent = self.getPos

def getPos(self , event):
    x = event.pos().x()
    y = event.pos().y() 
5
ответ дан ralphtheninja 17 August 2018 в 11:24
поделиться

Этот вопрос старый, но для всех, кто здесь, как и я, это мое решение, основанное на ответе Джареда:

self.img = QImage('fname.png')
pixmap = QPixmap(QPixmap.fromImage(self.img))
img_label = QLabel()
img_label.setPixmap(pixmap)
img_label.mousePressEvent = self.getPixel

def self.getPixel(self, event):
    x = event.pos().x()
    y = event.pos().y()
    c = self.img.pixel(x,y)  # color code (integer): 3235912
    # depending on what kind of value you like (arbitary examples)
    c_qobj = QColor(c)  # color object
    c_rgb = QColor(c).getRgb()  # 8bit RGBA: (255, 23, 0, 255)
    c_rgbf = QColor(c).getRgbf()  # RGBA float: (1.0, 0.3123, 0.0, 1.0)
    return x, y, c_rgb

Убедитесь, что размер метки соответствует размеру изображения, иначе координаты мыши x и y должны быть преобразованы в координаты изображения. И я думаю, что также возможно использовать метод .pixel() непосредственно на pixmap, но объект QImage, похоже, работает лучше в моем случае.

0
ответ дан sarbot 17 August 2018 в 11:24
поделиться
Другие вопросы по тегам:

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