Вызов метода при передаче имени объекта в функцию
От: Gordon Freeman  
Дата: 18.09.17 20:27
Оценка:
Доброго всем времени дня.
Пытаюс вызвать метод при передаче имени объекта в функцию.

Подгружаю данные в таблицу:
Direction_0_1 = new QTableWidget(0, 0, Direction_0);

По нажатию кнопки колонки должны изменить ширину по размеру данных. В первом случае всё работает:
connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol()));
....
void MainWindow::SetAutocol()
{
Direction_0_1->resizeColumnsToContents();
}

Во втором нет:
connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol(Direction_0_1)));
....
void MainWindow::SetAutocol(QTableWidget *table)
{
table->resizeColumnsToContents();
}

Компилятор не ругается, но результат нулевой.
Есть идеи?

P.S. Я в Qt и С++ новичёк. Учу потихоньку. Прошу сильно не ругать.
Re: Вызов метода при передаче имени объекта в функцию
От: Senyai Россия http://www.arseniy.net
Дата: 18.09.17 20:48
Оценка:
Здравствуйте, Gordon Freeman, Вы писали:

GF>Есть идеи?


В SLOT(SetAutocol(Direction_0_1)) Direction_0_1, должен быть типом, но, судя по всему, это не тип.

Мне кажется, пора уже отказаться от директив препроцессора SLOT и SIGNAL. Есть новый синтаксис:

QObject::connect(&a, &Counter::valueChanged,
                 &b, &Counter::setValue);


Из основных плюсов — компилятор станет ругаться на ошибки. Подробнее тут http://doc.qt.io/qt-5/signalsandslots.html.
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали
Re[2]: Вызов метода при передаче имени объекта в функцию
От: K13 http://akvis.com
Дата: 19.09.17 05:05
Оценка: 4 (1) +1
S>В SLOT(SetAutocol(Direction_0_1)) Direction_0_1, должен быть типом, но, судя по всему, это не тип.

Нет, тут топикстартер хотел вызвать по сигналу вызвать слот с определенным параметром.
Так не выйдет -- слоты вызываются только с параметрами сигнала (можно не всеми или или вообще все проигнорить).

Нужного эффекта можно добиться, сделав мини-слот SetDir01(), в котором дернуть нужное с параметром Direction_0_1.
Или, как вариант -- взять QSignalMapper.
Re: Вызов метода при передаче имени объекта в функцию
От: Igore Россия  
Дата: 19.09.17 06:54
Оценка: +1
Здравствуйте, Gordon Freeman, Вы писали:

GF>Доброго всем времени дня.

GF>Пытаюс вызвать метод при передаче имени объекта в функцию.
Передача дополнительных данных которых нет в сигнале
Автор: Igore
Дата: 18.02.15


GF>Подгружаю данные в таблицу:

GF>Direction_0_1 = new QTableWidget(0, 0, Direction_0);
Лучше сразу хорошо делать, использовать QTableView

GF>По нажатию кнопки колонки должны изменить ширину по размеру данных. В первом случае всё работает:

GF>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol()));
GF>Во втором нет:
GF>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol(Direction_0_1)));
Слот не может принимать больше параметров чем испускается в сигнале.

GF>Компилятор не ругается, но результат нулевой.

При таком синтаксисе ошибка во время исполнения, в Output выведется, и connect false вернет

GF>P.S. Я в Qt и С++ новичёк. Учу потихоньку. Прошу сильно не ругать.

А зачем тебе передавать table как параметр?
connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocolDirection_0_1()));
void MainWindow::SetAutocolDirection_0_1()
{
  Direction_0_1->resizeColumnsToContents();
}
// Или даже объединить
connect(resizeallcol, &QPushButton::clicked, this, [this](){Direction_0_1->resizeColumnsToContents();});
Re[2]: Вызов метода при передаче имени объекта в функцию
От: Gordon Freeman  
Дата: 19.09.17 08:03
Оценка:
Здравствуйте, Igore, Вы писали:

I>Здравствуйте, Gordon Freeman, Вы писали:


GF>>Доброго всем времени дня.

GF>>Пытаюс вызвать метод при передаче имени объекта в функцию.
I>Передача дополнительных данных которых нет в сигнале
Автор: Igore
Дата: 18.02.15


GF>>Подгружаю данные в таблицу:

GF>>Direction_0_1 = new QTableWidget(0, 0, Direction_0);
I>Лучше сразу хорошо делать, использовать QTableView

GF>>По нажатию кнопки колонки должны изменить ширину по размеру данных. В первом случае всё работает:

GF>>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol()));
GF>>Во втором нет:
GF>>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol(Direction_0_1)));
I>Слот не может принимать больше параметров чем испускается в сигнале.

GF>>Компилятор не ругается, но результат нулевой.

I>При таком синтаксисе ошибка во время исполнения, в Output выведется, и connect false вернет

GF>>P.S. Я в Qt и С++ новичёк. Учу потихоньку. Прошу сильно не ругать.

I>А зачем тебе передавать table как параметр?
I>
I>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocolDirection_0_1()));
I>void MainWindow::SetAutocolDirection_0_1()
I>{
I>  Direction_0_1->resizeColumnsToContents();
I>}
I>// Или даже объединить
I>connect(resizeallcol, &QPushButton::clicked, this, [this](){Direction_0_1->resizeColumnsToContents();});
I>



Здравствуйте.
Спасибо всем за ответы.

Программа должна подгружать .csv файлы (коих может быть более дюжины) в таблицы. Затем в таблицах всё фильтроваться (удалять ненужное и т.д.).
Т.к. количество таблиц не фиксировано, я попытался написать универсальную ф-ю, которая выполняля бы нужные операции при передаче в неё указателя на таблицу как параметра.
Если вызываю ф-ю без параметра, при этом в теле её указывая таблицу (мини-слот как указал К13), то всё пашет: connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol()));
Проблема в том, что тогда на каждую таблицу придётся писать отдельную ф-ю.
Re[3]: Вызов метода при передаче имени объекта в функцию
От: Gordon Freeman  
Дата: 19.09.17 08:06
Оценка: +1
Здравствуйте, Gordon Freeman, Вы писали:

GF>Здравствуйте, Igore, Вы писали:


I>>Здравствуйте, Gordon Freeman, Вы писали:


GF>>>Доброго всем времени дня.

GF>>>Пытаюс вызвать метод при передаче имени объекта в функцию.
I>>Передача дополнительных данных которых нет в сигнале
Автор: Igore
Дата: 18.02.15


GF>>>Подгружаю данные в таблицу:

GF>>>Direction_0_1 = new QTableWidget(0, 0, Direction_0);
I>>Лучше сразу хорошо делать, использовать QTableView

GF>>>По нажатию кнопки колонки должны изменить ширину по размеру данных. В первом случае всё работает:

GF>>>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol()));
GF>>>Во втором нет:
GF>>>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol(Direction_0_1)));
I>>Слот не может принимать больше параметров чем испускается в сигнале.

GF>>>Компилятор не ругается, но результат нулевой.

I>>При таком синтаксисе ошибка во время исполнения, в Output выведется, и connect false вернет

GF>>>P.S. Я в Qt и С++ новичёк. Учу потихоньку. Прошу сильно не ругать.

I>>А зачем тебе передавать table как параметр?
I>>
I>>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocolDirection_0_1()));
I>>void MainWindow::SetAutocolDirection_0_1()
I>>{
I>>  Direction_0_1->resizeColumnsToContents();
I>>}
I>>// Или даже объединить
I>>connect(resizeallcol, &QPushButton::clicked, this, [this](){Direction_0_1->resizeColumnsToContents();});
I>>



GF>Здравствуйте.

GF>Спасибо всем за ответы.

GF>Программа должна подгружать .csv файлы (коих может быть более дюжины) в таблицы. Затем в таблицах всё фильтроваться (удалять ненужное и т.д.).

GF>Т.к. количество таблиц не фиксировано, я попытался написать универсальную ф-ю, которая выполняля бы нужные операции при передаче в неё указателя на таблицу как параметра.
GF>Если вызываю ф-ю без параметра, при этом в теле её указывая таблицу (мини-слот как указал К13), то всё пашет: connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol()));
GF>Проблема в том, что тогда на каждую таблицу придётся писать отдельную ф-ю.

А ларчик просто открвыался:
connect(resizeallcol, SIGNAL(clicked()), Direction_0_1, SLOT(resizeColumnsToContents()));
Re[4]: Вызов метода при передаче имени объекта в функцию
От: Igore Россия  
Дата: 19.09.17 09:20
Оценка:
Здравствуйте, Gordon Freeman, Вы писали:

GF>А ларчик просто открвыался:

GF>connect(resizeallcol, SIGNAL(clicked()), Direction_0_1, SLOT(resizeColumnsToContents()));
Да, совсем заработался и на лямбдах зациклился , можно еще это же самое сделать не в коде, а в дизайнере. Изменение сигнал/слотов(F4),
  ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableWidget"/>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>pushButton</sender>
<signal>clicked()</signal>
<receiver>tableWidget</receiver>
<slot>resizeColumnsToContents()</slot>
<hints>
<hint type="sourcelabel">
<x>52</x>
<y>21</y>
</hint>
<hint type="destinationlabel">
<x>131</x>
<y>75</y>
</hint>
</hints>
</connection>
</connections>
</ui>
Re[2]: Вызов метода при передаче имени объекта в функцию
От: AlexGin Беларусь  
Дата: 21.09.17 09:07
Оценка: -1
Здравствуйте, Igore, Вы писали:

GF>>Подгружаю данные в таблицу:

GF>>Direction_0_1 = new QTableWidget(0, 0, Direction_0);
I>Лучше сразу хорошо делать, использовать QTableView

А в чём проблема применения QTableWidget?

Вот здесь:
http://www.cyberforum.ru/qt/thread238089.html
пишут о том, что если у нас менее чем примерно 500 строк, то удобнее применять QTableWidget (обеспечивает более удобное API).

Здесь:
http://www.qtforum.org/article/25107/display-large-dataset-using-qtablewidget-or-qtableview.html
пишут, что QTableView предпочтительнее при работе с БД, когда есть таблица с большим количеством записей —
вариант с QTableView выигрывает за счёт применения Model/View архитектуры.

Как я понял, универсального решения нет. Однако, изучая исходники Qt и заметив, что QTableWidget — наследник от QTableView:
class Q_WIDGETS_EXPORT QTableWidget : public QTableView
{
    Q_OBJECT
    ...
};

Я бы опасался однозначно рекомендовать TCу переход на QTableView от QTableWidget.
Отредактировано 21.09.2017 9:14 AlexGin . Предыдущая версия .
Re[3]: Вызов метода при передаче имени объекта в функцию
От: Qt-Coder  
Дата: 21.09.17 10:24
Оценка:
Здравствуйте, AlexGin, Вы писали:

QTableWidget внутрях использует те же model/view, то есть это просто нашлепка на QTableView.
Re[3]: Вызов метода при передаче имени объекта в функцию
От: Igore Россия  
Дата: 21.09.17 17:52
Оценка: +2
Здравствуйте, AlexGin, Вы писали:

GF>>>Подгружаю данные в таблицу:

GF>>>Direction_0_1 = new QTableWidget(0, 0, Direction_0);
I>>Лучше сразу хорошо делать, использовать QTableView
AG>А в чём проблема применения QTableWidget?
Да ни в чем, просто при использовании QTableView у тебя появится модель(отдельно), а дальше как обычно бывает, QTableView мигрирует в QTreeView, или надо QItemSelectionModel на несколько View или отдельные делегаты для колонок или QProxyModel нужна, в общем ИМХО когда настанет час Ха лучше чтобы у тебя была модель и QTableView, чем только QTableWidget где все перемешано.
Re: Вызов метода при передаче имени объекта в функцию
От: Skorodum Россия  
Дата: 22.09.17 10:19
Оценка:
Здравствуйте, Gordon Freeman, Вы писали:

GF>connect(resizeallcol, SIGNAL(clicked()), this, SLOT(SetAutocol(Direction_0_1)));

GF>....
GF>void MainWindow::SetAutocol(QTableWidget *table)
GF>{
GF> table->resizeColumnsToContents();
GF>}

GF>Компилятор не ругается, но результат нулевой.

GF>Есть идеи?

Если я правильно понял чего ты хочешь, то лямбда твой друг:

connect(resizeallcol, &QClass::clicked, [this]{this->SetAutocol(Direction_0_1);}));

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.