Возможным решением является реализация QProxyStyle
:
from PyQt5 import QtCore, QtGui, QtWidgets
class RoundPixmapStyle(QtWidgets.QProxyStyle):
def __init__(self, radius=10, *args, **kwargs):
super(RoundPixmapStyle, self).__init__(*args, **kwargs)
self._radius = radius
def drawItemPixmap(self, painter, rectangle, alignment, pixmap):
painter.save()
pix = QtGui.QPixmap(pixmap.size())
pix.fill(QtCore.Qt.transparent)
p = QtGui.QPainter(pix)
p.setBrush(QtGui.QBrush(pixmap))
p.setPen(QtCore.Qt.NoPen)
p.drawRoundedRect(pixmap.rect(), self._radius, self._radius)
p.end()
super(RoundPixmapStyle, self).drawItemPixmap(painter, rectangle, alignment, pix)
painter.restore()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
proxy_style = RoundPixmapStyle(radius=20, style=w.style())
w.setStyle(proxy_style)
movie = QtGui.QMovie("foo.gif")
w.setMovie(movie)
movie.start()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
Это могло бы скомпилировать, но это не будет работать.
Не совсем ясно, чего Вы пытаетесь достигнуть. Я думаю, что Вы хотите ассоциативный массив, в этом случае необходимо найти реализацию библиотеки одной.
Если Вы ищете что-то больше как перечислимый тип, и можно полагаться на C89, посмотреть на что-то как:
enum cardsuit {
CLUBS,
DIAMONDS,
HEARTS,
SPADES
};
Если Вы не можете полагаться на C89, то необходимо попробовать некоторых typedef
обман.
Можно легко создать справочные таблицы с функцией bsearch()
если stdlib.h
. Рабочий пример - это:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define count(ARRAY) (sizeof(ARRAY)/sizeof(*ARRAY))
struct item
{
const char * name;
int value;
};
static _Bool sorted;
static struct item items[] =
{
{ "one", 1 },
{ "two", 2 },
{ "three", 3 },
{ "ten", 10 }
};
static int compare(const void * p1, const void * p2)
{
return strcmp(*((const char **)p1), *((const char **)p2));
}
int get(const char * name)
{
if(!sorted)
{
qsort(items, count(items), sizeof(*items), compare);
sorted = 1;
}
struct item * item = bsearch(&name, items, count(items), sizeof(*items),
compare);
return item ? item->value : 0;
}
int main(int argc, char ** argv)
{
int i;
for(i = 1; i < argc; ++i)
printf("%i\n", get(argv[i]));
return 0;
}
Необходимо будет записать функцию, которая отображает строки на целые числа, или альтернативно используйте перечисления повсюду (и затем возможно, функция, которая отображает перечисляемые значения на строки).
В целом более хорошо сделать последнего: передать целые числа, так, чтобы реализация не зависела от деталей строк, которые могли бы использоваться в представлении. Например, думайте о том, как Вы справились бы с локализацией (перевод), если когда-нибудь необходимо сделать те строки приемлемыми кому-то говорящему на другом языке.
Существуют другие превосходные ответы на то, что необходимо сделать, таким образом, я думал, что объясню, что Вы делаете и почему это компилирует и не работает.
В C ссылка на массив сделана при наличии массива или указателя и какого-то целого числа. (в x [1], x является массивом, и 1 целое число). Пока Вы используете некоторый целочисленный тип, он будет работать, как Вы ожидаете.
Предположим, что у Вас есть что-то, что это не целое число. В этом случае реализация C будет видеть, может ли она преобразовать его в соответствующий тип, таким образом, Вы волнуете с массивом и целым числом. Это - случаи как это, где Вы попадаете в беду (и немного более сложные версии этого в C++ смутили более опытных людей, чем Вы).
В C литеральной строке как "каждый" имеет символ константы типа *, имея в виду указатель на символы, которые Вы не можете изменить. Фактическое значение является адресом памяти того, где строка на самом деле находится в памяти. Обычно, Вы не уделили бы внимания этому значению указателя и посмотрели бы на строковое значение, но здесь существует глюк.
В C любой указатель данных может быть преобразован в своего рода целое число и будет автоматически. Поэтому у Вас есть строка как "одна", и ее значение является любым числом, которое представляет адрес памяти. Используйте его, где C ожидает своего рода целое число, и это будет преобразовано в некоторое интегральное значение или другой.
Поэтому это - то, что происходит с x ["ОДИН"]. Система C должна поместить строку "ОДИН" где-нибудь в памяти, и она не имеет значения где. Это, вероятно, будет где-нибудь с адресом довольно памяти большой емкости, вполне возможно в миллиардах. Когда это видит x ["ОДИН"], это пытается преобразовать то значение в целое число и использует его в качестве нижнего индекса. Поэтому Вы пытаетесь получить доступ к массиву x далеко, далеко вне его границ, и это вызывает проблему. Или Вы пытаетесь использовать память, которой Вас не разрешают, и система просто останавливает Вас, или Вы унавоживаете с блоком памяти, которую необходимо оставлять в покое, и это, вероятно, перестанет работать некоторым таинственным способом позже.
То, что Вы ищете, является, вероятно, эквивалентом ассоциативного массива, которому нельзя предоставить тот же синтаксический сахар в C, к сожалению, без некоторых глупых результатов.
Однако то, что можно обеспечить, является hashmap, если данные соответствуют для манипулирования-> пары значения. То, в чем Вы будете нуждаться, является appropiate хеш-функцией.
Существует достойный простой пример хеш-таблицы здесь:
В "плоскости C" можно подражать использованию строки как индекс, но НЕ СОВСЕМ в пути Вы, кажется, желаете. Однако выполнение так редко полезно и главным образом отличный способ сделать Ваш код нечитабельным. То, что Вы, кажется, желаете, должно смочь использовать строковые ключи в словарь (или "хеш-таблица", если Вы предпочитаете) и нет никакой встроенной структуры данных для этого в C. Точный дизайн зависел бы от того, что Вы хотите (и, действительно, если это - часть домашней работы, Вы даже, возможно, не должны использовать законченную реализацию хеш-таблицы, но могли, вероятно, сойти с рук меньше производительного статического кодирования).
Пример с помощью строки (хорошо, массив символов) в "индексном положении) [b] конструкция:
int main (void)
{
char *str = "This is a test string";
int x;
for (x=0; x < 12; x += 3)
putchar(x[str]);
printf("\n");
return 0;
}
Вышеупомянутое, насколько я могу сказать, легальный C, с четко определенным выводом (строка "Tss ssi"). Это полагается на то, которое [b] определяется для совпадения с * (a+b).
Как уже обозначено, Вы нуждаетесь в ассоциативном массиве или хешируете карту или эквивалент. Одним возможным источником для такого кода является Hanson "C Интерфейсы и Реализации" (код в Google Code - условия лицензирования двойной проверки и т.д. перед использованием его.)