Как расширить виджет Qt
Всем привет. Подскажите плез как решить данную задачку и можно ли это вообще сделать на 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. И потом все как завещал полиморфизм.
Может я туплю, но у меня никак не получается это реализовать. Помогите плез.
Ответы (1 шт):
Варианта решения два:
Сделать класс, реализующий необходимые расширения для виджетов (назовем его для примера
Extension), далее отнаследоватьExtLineEditотQLineEditиExtension,ExtCheckBoxотQCheckBoxиExtensionи так далее. Дальше как обычно - получаем указатель на виджет в ячейке, кастуем его кExtension *и дергаем методы расширения. Обратите внимание, что не надо наследовать сам классExtensionотQObject.В том случае если вам надо просто положить определенные данные в объект и потом достать оттуда, и никакой сложной логики не требуется, можно не делать двойного наследования и воспользоваться системой свойств класса
QObject:
widget->setProperty("answer", 42);
int answer = widget->property("answer").toInt();
Подробнее про свойства тут https://doc.qt.io/qt-5/properties.html#reading-and-writing-properties-with-the-meta-object-system