大家好。请告诉我如何解决这个问题,甚至可以在 C++ 中完成吗?一点介绍。
我在 Qt 工作。它有一个QWidget类,从中继承了各种QLineEdit、QCheckBox、QTextEdit等。(任何图形元素)。还有一个QTableWidget,你可以在它的单元格中使用该方法推入不同的小部件(相同的QLineEdit、QCheckBox、QTextEdit等)void setCellWidget(int row, int column, QWidget *widget);,并且您可以使用该方法获取小部件QWidget *cellWidget(int row, int column) const;
所以,我需要以某种方式向QWidget添加几个虚拟方法,以便它们在相同的QLineEdit、QCheckBox、QTextEdit和其他继承自QWidget的类中可用。也许在QWidget及其后代之间,您可以创建某种层来推送必要的方法,但我不知道如何。这个想法是我应该能够将不同类型的扩展小部件(QLineEdit,QCheckBox ...)放入QTableWidget中,然后以我可以调用我添加的方法的方式将它们取回。但我不能这样做,因为它QTableWidget::cellWidget(row, column);返回一个指向QWidget当然没有我的方法。
或者,您可以从每个必要的图形元素( QLineEdit、QCheckBox ...)继承并在每个元素中编写我需要的方法。
class ExtLineEdit : public QLineEdit
{
public:
void method1();
void method2();
...
}
class ExtCheckBox : public QCheckBox
{
public:
void method1();
void method2();
...
}
...
tableWidget.setCellWidget(0, 0, new ExtLineEdit);
tableWidget.setCellWidget(0, 1, new ExtCheckBox);
但这里的问题是,当我从QTableWidget以指向QWidget的指针格式获取这些小部件时,我必须知道将其转换为什么(到 ExtLineEdit、ExtCheckBox 或其他东西)。这个我不知道。如果有一些接口可以将接收到的QWidget指针转换为它会很方便。然后一切都是多态性的遗赠。
也许我很笨,但我就是无法让它发挥作用。请帮忙。
有两种可能的解决方案:
创建一个实现小部件必要扩展的类(让我们称之为 example
Extension),然后继承ExtLineEdit自QLineEditandExtension,ExtCheckBoxfromQCheckBoxandExtension等等。然后,像往常一样,我们得到一个指向单元格中小部件的指针,将其转换为Extension *并拉取扩展方法。请注意,您不需要Extension从QObject.如果您只需要将某些数据放入对象中然后从那里获取它,并且不需要复杂的逻辑,则可以跳过双重继承并使用类属性系统
QObject:更多关于这里的属性https://doc.qt.io/qt-5/properties.html#reading-and-writing-properties-with-the-meta-object-system