ما هي أفضل طريقة لجعل خلايا QtableView لها زر صعودا وهبوطا دخلت الدول في كيو تي؟
-
13-09-2019 - |
سؤال
أحاول أن أجعل خلايا QTableView
تبدو وكأنها أزرار ثلاثية الأبعاد قابلة للنقر. حتى عند النقر فوق خلية، يبدو الزر دفعه. يبدو أن الجميع يعتقدون أنني أرغب فقط في تغيير اللون، أحتاج إلى إظهار صور زر طبيعية، وزر دفع، الذي يبدو ثلاثي الأبعاد.
لقد فعلت هذا بالفعل مع الاتصال QTableView::setItemDelegate()
, مع مناسب ItemDelegate
سيؤدي ذلك إلى تغيير خلفية الخلية عند النقر فوقه. ومع ذلك، فأنا عالق في هذه المرحلة لأنني أريد أن تكون بعض الخلايا أزرارا مختلفا على أساس البيانات التي تحتوي عليها. لذا فإن الخلية ذات الرقم المنخفض ستكون زر أحمر، وهذا أيضا أحمر عند النقر عليه، وستكون الخلايا الأخرى ألوان مختلفة.
يمكنني ضبط لون الزر مع TableModel
, ، ولكن بمجرد النقر فوق الزر، لا توجد وسيلة ل ItemDelegate
لمعرفة أنه من المفترض أن يكون لون مختلف عن البقية. كيف يمكنك ربط الاثنين ItemDelegate
يعرف ما اللون من المفترض أن يكون؟
أيضا، هل هناك ببساطة طريقة أفضل لجعل الخلايا تبدو وكأنها أزرار؟
المحلول
تستطيع الاتصال QModelIndex::model()
من داخل ItemDelegate
'س paint()
الطريقة، لأنه لديه QModelIndex
معامل. هذا يمنحك TableModel
بالنسبة للبيانات، والتي يمكنك تحديد اللون ببرمجة ما هو لون زر الخلية سيكون.
ومع ذلك، هذا لا يزال غير أنيق كما آمل. هل يعرف أحد وسيلة أفضل لتغيير مظهر خلايا الجدول عندما يدفع زر أعلى وأسفل إلى أسفل؟
نصائح أخرى
لماذا لا تطلب من الفهرس لون الخلفية.
شيء من هذا القبيل ...
QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) );
//...
لدي شعور بأنه خطأ في كيو تي ويجب أن يكون ...
// model code
if(role==Qt::BackgroundColorRole )
return qvariant_cast<QBrush>( QBrush(Qt::red) );
// delegate code
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );
بسبب ال optionV4.backgroundBrus
H صحيح في sizeHint
طريقة ولكن غير صالحة في paint
طريقة . أرى الآن سبب لماذا sizeHint
يجب أن يكون لديك فرشاة الخلفية و paint
طريقة لا. سأبلغ عنها إلى نوكيا.
تعديل:
يبدو أنني كنت على حق وله خطأ في <QT4.5.
QstyleoptionViewItemv4 لا ينسخ الرمز والفارس
هل لا يمكنك الحصول على حساب المعرف / الصف من صف خلية الجدول ثم التحقق من ذلك مقابل جدول اللون الذي قد تواجهه، وتعيين اللون وفقا لذلك؟ لست متأكدا مما إذا كنت تفهم سؤالك جيدا أم لا.
تعيين دور بيانات لكون الخلفية، وفي مندوب البند الخاص بك، اطلب من فهرس النموذج ما هو لون الخلفية (باستخدام data( bg_color_role )
أو شيئا من هذا القبيل). ثم، في النموذج الخاص بك، تحتاج إلى التأكد من إرجاع وظيفة البيانات لونا ل bg_color_role
هذا مناسب للبيانات التي يتم تصميمها على غرار.
طريقة القيام بذلك هي استخدام طريقة البيانات لكائن QModelindex الذي تحصل عليه على طريقة الطلاء، وطلب دورا محددا (إذا حددت نموذجا مخصصا، فيمكنك إضافة الأدوار الخاصة بك، وإعطاء المعلومات التي تحتاج إليها المندوب في تلك الأدوار.)
timw، أعتقد أن عليك ملء معلومات QSTYLEOPTONVIEVIENITEMV4 عن طريق استدعاء initstyleoption من قبل.
لست متأكدا من أين يأتي متطلبات صورة الخلفية. إذا كنت تريد أن تبدو الخلايا QPushButton
S، ربما يجب أن ترث من QItemDelegate
وتنفيذ paint()
ليستخدم QStyle
لرسم لك QPushButton
, ، شيء من هذا القبيل:
QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );
هل حاولت استخدام أوراق الأنماط المخصصة؟
يمكنك فقط تطبيق ورقة الأنماط نفسها على كل خلية، ثم قم بتغيير صورة / نمط الخلفية لرسم صور الزر ثلاثية الأبعاد اعتمادا على ما إذا كان محددا أم لا.