التقاط/توصيل QPushButtons داخل QTableWidget بوظيفة
-
13-12-2019 - |
سؤال
أنا مطور طلابي أستخدم Qt لإنشاء واجهة مستخدم رسومية لمساعدة المستخدمين على رسم أعمدة محددة من البيانات الموجودة في ملفات متعددة.الميزة التي أقوم بإعدادها تسمح للمستخدمين بتحديد ملف باستخدام زر في كل صف.لذلك سيقول الزر في الأصل "تصفح" ثم ينقر عليه المستخدم لفتح مربع حوار لتحديد ملف ثم يتم استبدال نص الزر باسم الملف المحدد.آسف على القصة؛محاولتي البسيطة لإضافة بعض الوضوح.
المشكلة التي أواجهها هي أنني لست متأكدًا من كيفية إعداد سياسة للزر الذي تم النقر عليه.أتخيل أنني سأضطر إلى توسيع وظائف كل زر من أزرار QPushButtons ولكني لا أعرف حقًا كيفية القيام بذلك.حتى الآن أستخدم ما يلي لتعيين أداة الخلية.
//with row count set dimensions are set becasue column count is static
//begin bulding custom widgets/QTableWidgetItems into cells
for(int x = 0; x < ui->tableWidgetPlotLineList->rowCount(); x++)
{
for(int y = 0; y < ui->tableWidgetPlotLineList->columnCount(); y++)
{
if(y == 1)
{
//install button widget for file selection
QPushButton *fileButton = new QPushButton();
if(setDataStruct.plotLineListData.at(rowCount).lineFileName != "");
{
fileButton->setText(setDataStruct.plotLineListData.at(rowCount).lineFileName);
}
else
{
fileButton->setText("Browse...");
}
ui->tableWidgetPlotLineList->setCellWidget(x, y, fileButton);
}
كنت أفكر في أن
connect(ui->tableWidgetPlotLineList->row(x), SIGNAL(fileButton->clicked()), this, SLOT(selectPlotLineFile(x));
قد أقوم بالخدعة ولكني أعتقد أنني ربما أسير في الاتجاه الخاطئ هنا.بصراحة، لست متأكدًا حتى من أين سيصل الأمر...
شكرا جزيلا لقراءة رسالتي.يرجى إعلامي إذا كان هناك أي شيء ناقص في هذا المنشور وسأقوم بتحديثه على الفور.أود أيضًا أن أشكر أي مساهمات في هذا المنشور مقدمًا!
المحلول
connect(ui->tableWidgetPlotLineList->row(x), SIGNAL(fileButton->clicked()), this, SLOT(selectPlotLineFile(x));
غير صحيح من الناحية التركيبية لاتصال الإشارة/الفتحة.شيء من هذا القبيل سيكون أكثر ملاءمة:
connect(fileButton, SIGNAL(clicked()), this, SLOT(selectPlotLineFile(x));
...
إذا كنت بحاجة إلى الوصول إلى الزر المحدد emit
إد clicked()
إشارة مما يمكنك استخدام sender()
وظيفة في الفتحة الخاصة بك:
void selectPlotLineFile() {
QPushButton *button = dynamic_cast<QPushButton*>( sender() )
}
ربما تتساءل الآن عن كيفية معرفة الصف الذي يجب العمل عليه.هناك عدة طرق مختلفة، أحد أسهلها هو الحفاظ على QMap<QPushButton*, int>
متغير العضو الذي يمكنك استخدامه للبحث عن الزر الذي ينتمي إلى أي صف.