ما هي أفضل طريقة لجعل خلايا QtableView لها زر صعودا وهبوطا دخلت الدول في كيو تي؟

StackOverflow https://stackoverflow.com/questions/970618

سؤال

أحاول أن أجعل خلايا QTableView تبدو وكأنها أزرار ثلاثية الأبعاد قابلة للنقر. حتى عند النقر فوق خلية، يبدو الزر دفعه. يبدو أن الجميع يعتقدون أنني أرغب فقط في تغيير اللون، أحتاج إلى إظهار صور زر طبيعية، وزر دفع، الذي يبدو ثلاثي الأبعاد.

لقد فعلت هذا بالفعل مع الاتصال QTableView::setItemDelegate(), مع مناسب ItemDelegate سيؤدي ذلك إلى تغيير خلفية الخلية عند النقر فوقه. ومع ذلك، فأنا عالق في هذه المرحلة لأنني أريد أن تكون بعض الخلايا أزرارا مختلفا على أساس البيانات التي تحتوي عليها. لذا فإن الخلية ذات الرقم المنخفض ستكون زر أحمر، وهذا أيضا أحمر عند النقر عليه، وستكون الخلايا الأخرى ألوان مختلفة.

يمكنني ضبط لون الزر مع TableModel, ، ولكن بمجرد النقر فوق الزر، لا توجد وسيلة ل ItemDelegate لمعرفة أنه من المفترض أن يكون لون مختلف عن البقية. كيف يمكنك ربط الاثنين ItemDelegate يعرف ما اللون من المفترض أن يكون؟

أيضا، هل هناك ببساطة طريقة أفضل لجعل الخلايا تبدو وكأنها أزرار؟

هل كانت مفيدة؟

المحلول

تستطيع الاتصال QModelIndex::model() من داخل ItemDelegatepaint() الطريقة، لأنه لديه 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.backgroundBrusH صحيح في sizeHint طريقة ولكن غير صالحة في paint طريقة . أرى الآن سبب لماذا sizeHint يجب أن يكون لديك فرشاة الخلفية و paint طريقة لا. سأبلغ عنها إلى نوكيا.

تعديل:

يبدو أنني كنت على حق وله خطأ في <QT4.5.
QstyleoptionViewItemv4 لا ينسخ الرمز والفارس

هل لا يمكنك الحصول على حساب المعرف / الصف من صف خلية الجدول ثم التحقق من ذلك مقابل جدول اللون الذي قد تواجهه، وتعيين اللون وفقا لذلك؟ لست متأكدا مما إذا كنت تفهم سؤالك جيدا أم لا.

تعيين دور بيانات لكون الخلفية، وفي مندوب البند الخاص بك، اطلب من فهرس النموذج ما هو لون الخلفية (باستخدام data( bg_color_role ) أو شيئا من هذا القبيل). ثم، في النموذج الخاص بك، تحتاج إلى التأكد من إرجاع وظيفة البيانات لونا ل bg_color_role هذا مناسب للبيانات التي يتم تصميمها على غرار.

طريقة القيام بذلك هي استخدام طريقة البيانات لكائن QModelindex الذي تحصل عليه على طريقة الطلاء، وطلب دورا محددا (إذا حددت نموذجا مخصصا، فيمكنك إضافة الأدوار الخاصة بك، وإعطاء المعلومات التي تحتاج إليها المندوب في تلك الأدوار.)

timw، أعتقد أن عليك ملء معلومات QSTYLEOPTONVIEVIENITEMV4 عن طريق استدعاء initstyleoption من قبل.

لست متأكدا من أين يأتي متطلبات صورة الخلفية. إذا كنت تريد أن تبدو الخلايا QPushButtonS، ربما يجب أن ترث من 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 );

هل حاولت استخدام أوراق الأنماط المخصصة؟

يمكنك فقط تطبيق ورقة الأنماط نفسها على كل خلية، ثم قم بتغيير صورة / نمط الخلفية لرسم صور الزر ثلاثية الأبعاد اعتمادا على ما إذا كان محددا أم لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top