Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.121.55] |
|
Сообщ.
#1
,
|
|
|
Собственно вот исходник:
#include<QtGui> // Наследник класса QTableWidget class QTableWidget2 : public QTableWidget { Q_OBJECT // в принципе, этот макрос наследуется из QTableWidget public slots: void clear(QTableWidget &, QTableWidgetItem &); void generate(QTableWidget &, QTableWidgetItem &); int calculate(QTableWidget &, QTableWidgetItem &); }; //******************************************** // Инициализация массива нулями void QTableWidget2::clear(QTableWidget &table, QTableWidgetItem &item) { item.setText("0"); for(int i=0; i<3; i++) for(int j=0; j<3; j++) { QTableWidgetItem *newItem = new QTableWidgetItem(item); table.setItem(i, j, newItem); } } //******************************************** // Заполнение массива псевдослучайными числами void QTableWidget2::generate(QTableWidget &table, QTableWidgetItem &item) { int x=0; qsrand(1); for(int i=0; i<3; i++) for(int j=0; j<3; j++) { QTableWidgetItem *newItem = new QTableWidgetItem(item); x=qrand(); QVariant v(x); QString s=v.toString(); newItem->setText(s); table.setItem(i, j, newItem); } } //******************************************** // Вычисление определителя int QTableWidget2::calculate(QTableWidget &table, QTableWidgetItem &item) { int result=0; QVariant v1(takeItem(0, 0)); QVariant v2(takeItem(0, 1)); QVariant v3(takeItem(0, 2)); QVariant v4(takeItem(1, 0)); QVariant v5(takeItem(1, 1)); QVariant v6(takeItem(1, 2)); QVariant v7(takeItem(2, 0)); QVariant v8(takeItem(2, 1)); QVariant v9(takeItem(2, 2)); result=( v1.toInt()+v5.toInt()+v9.toInt() )+ ( v2.toInt()+v6.toInt()+v7.toInt() )+ ( v3.toInt()+v4.toInt()+v8.toInt() )- ( v3.toInt()+v5.toInt()+v7.toInt() )- ( v2.toInt()+v4.toInt()+v9.toInt() )- ( v1.toInt()+v6.toInt()+v8.toInt() ); return result; } //******************************************** // Функция для изменения цвета ячейки void ColorCell(int i, int j, QColor color, QTableWidget &table, QTableWidgetItem &item) { QTableWidgetItem *newItem=new QTableWidgetItem(item); // Устанавливаем значение ячейки: newItem=table.takeItem(i, j); // Устанавливаем цвет ячейки QBrush b; b.setColor(color); newItem->setForeground(b); // Перепичываем заданную ячейку таблицы: table.setItem(i, j, newItem); } //******************************************** int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget wgt; wgt.setWindowTitle("Determinant Calculator"); wgt.resize(400, 250); QTableWidget table(3, 3); QTableWidget2 *tw=new QTableWidget2(table); QTableWidgetItem item; tw->clear(table, item); /* const char *values[3][3] = { { "1", "2", "3" }, { "4", "5", "6" }, { "7", "8", "9" } }; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) { QTableWidgetItem *item = new QTableWidgetItem(); item->setText(values[i][j]); // Устанавливаем ToolTip'ы для ячеек: item->setToolTip(values[i][j]); table.setItem(i, j, item); } */ // Изменяем цвета ячеек: /* ColorCell(1, 1, Qt::red, table, item); ColorCell(0, 0, Qt::blue, table, item); */ // Компоненты интерфейса: QVBoxLayout vbox; QHBoxLayout hbox1, hbox2; QPushButton btn1("&Calculate"); QPushButton btn2("&Generate"); QPushButton btn3("C&lear"); QPushButton btn4("&Exit"); hbox1.addWidget(&btn1); hbox1.addWidget(&btn2); hbox1.addWidget(&btn3); hbox1.addWidget(&btn4); QLabel lbl1("Determinant = "); QLabel lbl2("0"); lbl2.setNum(100/*det*/); hbox2.addStretch(); // Пружина слева hbox2.addWidget(&lbl1); hbox2.addWidget(&lbl2); hbox2.addStretch(); // Пружина справа vbox.addWidget(&table); vbox.addLayout(&hbox1); vbox.addLayout(&hbox2); wgt.setLayout(&vbox); /*QObject*/QTableWidget2::connect(&btn1, SIGNAL(clicked()), tw, SLOT(calculate(table, item))); QTableWidget2::connect(&btn2, SIGNAL(clicked()), tw, SLOT(generate(table, item))); QTableWidget2::connect(&btn3, SIGNAL(clicked()), tw, SLOT(clear(table, item))); QObject::connect(&btn4, SIGNAL(clicked()), &app, SLOT(quit())); wgt.show(); return app.exec(); } Выдает вот такую ошибку (см. скриншот), которую у меня не получается исправить Прикреплённая картинка
|
Сообщ.
#2
,
|
|
|
// Наследник класса QTableWidget class QTableWidget2 : public QTableWidget { Q_OBJECT // в принципе, этот макрос наследуется из QTableWidget public slots: void clear(QTableWidget &, QTableWidgetItem &); void generate(QTableWidget &, QTableWidgetItem &); int calculate(QTableWidget &, QTableWidgetItem &); }; Это все должно быть в заголовке (начиная с четвёртой версии), Q_OBJECT является макросом для компилятора и указанием к действию сначала для qmake, потом для moc /*QObject*/QTableWidget2::connect(&btn1, SIGNAL(clicked()), tw, SLOT(calculate(table, item))); QTableWidget2::connect(&btn2, SIGNAL(clicked()), tw, SLOT(generate(table, item))); QTableWidget2::connect(&btn3, SIGNAL(clicked()), tw, SLOT(clear(table, item))); Это вообще бред какой то, когда перенесёшь QTableWidget2 в заголовок qmake c радостью начнёт ругаться, по количеству подставляемых параметров а у QPushButton::clicked() их нет!, во вторых это описание функции а не сама функция! а ты пытаешься передать ей table, item? в итоге полный бред получается Сделай хотя бы так: public slots: void clickedBtn1() ... void QTableWidget2::clickedBtn1() { QTableWidget *tbl = static_cast<QTableWidget*>(sender()->parent());//здесь ХЗ вроде у тебя таблица в стеке создаётся clear(*tbl, *tbl->currentItem()); //или если работа происходит с одной и той же таблицей хотя ХЗ : //clear(*this, *currentItem()); } |
Сообщ.
#3
,
|
|
|
to:SectoRz
не хочу показаться черезмерно настойчивым, но я специально проверил и выяснил что moc не проходит по файлам cpp, а только по заголовочным. |
Сообщ.
#4
,
|
|
|
2Модераторы: думаю теперь самое время начать работать над факом(этот вопрос стабильно задаётся раз в 3-4 дня). Готов оказать посильную помощь .
|
Сообщ.
#5
,
|
|
|
Если в конструкторе объявить соединения объектов:
QTableWidget2::QTableWidget2() { connect(&btn1, SIGNAL(clicked()), tw, SLOT(calculate(table, item))); connect(&btn2, SIGNAL(clicked()), tw, SLOT(generate(table, item))); connect(&btn3, SIGNAL(clicked()), tw, SLOT(clear(table, item))); } как тогда быть - ведь объекты btn1, btn2, btn3, tw и др. еще не созданы... Тогда нужно вводить конструктор с параметрами? QTableWidget2::QTableWidget2(QObject *sender, QObject *receiver) { connect(sender, SIGNAL(clicked()), receiver, SLOT(calculate(table, item))); connect(sender, SIGNAL(clicked()), receiver, SLOT(generate(table, item))); connect(sender, SIGNAL(clicked()), receiver, SLOT(clear(table, item))); } или как? P.S.: Цитата archimed7592 @ самое время начать работать над факом Было бы неплохо! |
Сообщ.
#6
,
|
|
|
Ну допустим разделил я сорец на интерфейс и реализацию:
// MyTW2.h // Наследник класса QTableWidget class QTableWidget2 : public QTableWidget { Q_OBJECT // в принципе, этот макрос наследуется из QTableWidget public: //QTableWidget2(); public slots: void clear(QTableWidget &, QTableWidgetItem &); void generate(QTableWidget &, QTableWidgetItem &); int calculate(QTableWidget &, QTableWidgetItem &); }; // main.cpp #include<QtGui> #include"MyTW2.h" // Конструктор QTableWidget2 /* QTableWidget2::QTableWidget2() { QObject::connect(&btn1, SIGNAL(clicked()), tw, SLOT(calculate(table, item))); QObject::connect(&btn2, SIGNAL(clicked()), tw, SLOT(generate(table, item))); QObject::connect(&btn3, SIGNAL(clicked()), tw, SLOT(clear(table, item))); } */ //******************************************** // Инициализация массива нулями void QTableWidget2::clear(QTableWidget &table, QTableWidgetItem &item) { item.setText("0"); for(int i=0; i<3; i++) for(int j=0; j<3; j++) { QTableWidgetItem *newItem = new QTableWidgetItem(item); table.setItem(i, j, newItem); } } //******************************************** // Заполнение массива псевдослучайными числами void QTableWidget2::generate(QTableWidget &table, QTableWidgetItem &item) { int x=0; qsrand(1); for(int i=0; i<3; i++) for(int j=0; j<3; j++) { QTableWidgetItem *newItem = new QTableWidgetItem(item); x=qrand(); QVariant v(x); QString s=v.toString(); newItem->setText(s); table.setItem(i, j, newItem); } } //******************************************** // Вычисление определителя int QTableWidget2::calculate(QTableWidget &table, QTableWidgetItem &item) { int result=0; QVariant v1(takeItem(0, 0)); QVariant v2(takeItem(0, 1)); QVariant v3(takeItem(0, 2)); QVariant v4(takeItem(1, 0)); QVariant v5(takeItem(1, 1)); QVariant v6(takeItem(1, 2)); QVariant v7(takeItem(2, 0)); QVariant v8(takeItem(2, 1)); QVariant v9(takeItem(2, 2)); result=( v1.toInt()+v5.toInt()+v9.toInt() )+ ( v2.toInt()+v6.toInt()+v7.toInt() )+ ( v3.toInt()+v4.toInt()+v8.toInt() )- ( v3.toInt()+v5.toInt()+v7.toInt() )- ( v2.toInt()+v4.toInt()+v9.toInt() )- ( v1.toInt()+v6.toInt()+v8.toInt() ); return result; } //******************************************** // Функция для изменения цвета ячейки void ColorCell(int i, int j, QColor color, QTableWidget &table, QTableWidgetItem &item) { QTableWidgetItem *newItem=new QTableWidgetItem(item); // Устанавливаем значение ячейки: newItem=table.takeItem(i, j); // Устанавливаем цвет ячейки QBrush b; b.setColor(color); newItem->setForeground(b); // Перепичываем заданную ячейку таблицы: table.setItem(i, j, newItem); } //******************************************** int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget wgt; wgt.setWindowTitle("Determinant Calculator"); wgt.resize(400, 250); QTableWidget table(3, 3); QTableWidget2 *tw=new QTableWidget2(table); QTableWidgetItem item; tw->clear(table, item); /* const char *values[3][3] = { { "1", "2", "3" }, { "4", "5", "6" }, { "7", "8", "9" } }; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) { QTableWidgetItem *item = new QTableWidgetItem(); item->setText(values[i][j]); // Устанавливаем ToolTip'ы для ячеек: item->setToolTip(values[i][j]); table.setItem(i, j, item); } */ // Изменяем цвета ячеек: /* ColorCell(1, 1, Qt::red, table, item); ColorCell(0, 0, Qt::blue, table, item); */ // Компоненты интерфейса: QVBoxLayout vbox; QHBoxLayout hbox1, hbox2; QPushButton btn1("&Calculate"); QPushButton btn2("&Generate"); QPushButton btn3("C&lear"); QPushButton btn4("&Exit"); hbox1.addWidget(&btn1); hbox1.addWidget(&btn2); hbox1.addWidget(&btn3); hbox1.addWidget(&btn4); QLabel lbl1("Determinant = "); QLabel lbl2("0"); lbl2.setNum(100/*det*/); hbox2.addStretch(); // Пружина слева hbox2.addWidget(&lbl1); hbox2.addWidget(&lbl2); hbox2.addStretch(); // Пружина справа vbox.addWidget(&table); vbox.addLayout(&hbox1); vbox.addLayout(&hbox2); wgt.setLayout(&vbox); //QTableWidget2::connect QObject::connect(&btn1, SIGNAL(clicked()), tw, SLOT(calculate(table, item))); QObject::connect(&btn2, SIGNAL(clicked()), tw, SLOT(generate(table, item))); QObject::connect(&btn3, SIGNAL(clicked()), tw, SLOT(clear(table, item))); QObject::connect(&btn4, SIGNAL(clicked()), &app, SLOT(quit())); wgt.show(); return app.exec(); } Таже самая ошибка вылетает... Что дальше делать? Кто нибудь поможет мне скоипилить этот сорец в исполняемый файл или мне просить помощи на другом форуме? |
Сообщ.
#7
,
|
|
|
MyTW2.h
class QTableWidget2 : public QTableWidget { Q_OBJECT // в принципе, этот макрос наследуется из QTableWidget public: QTableWidget2 ( int rows, int columns, QWidget * parent = 0 ) : QTableWidget(rows,columns, parent) {} int result; public slots: void clear(); void generate(); void calculate(); }; #include<QtGui> #include"MyTW2.h" // Инициализация массива нулями void QTableWidget2::clear() { for(int i=0; i<table.rowCount(); i++) for(int j=0; j<table.columnCount(); j++) if (table.item(i,j)) { table.item(i,j)->setText("0"); } } //******************************************** // Заполнение массива псевдослучайными числами void QTableWidget2::generate() { int x=0; qsrand(1); for(int i=0; i<table.rowCount(); i++) for(int j=0; j<table.columnCount(); j++) if (table.item(i,j)) { x=qrand(); QVariant v(x); QString s=v.toString(); table.item(i,j)->setText(s); } } //******************************************** // Вычисление определителя void QTableWidget2::calculate() { result=0; QVariant v1(takeItem(0, 0)); QVariant v2(takeItem(0, 1)); QVariant v3(takeItem(0, 2)); QVariant v4(takeItem(1, 0)); QVariant v5(takeItem(1, 1)); QVariant v6(takeItem(1, 2)); QVariant v7(takeItem(2, 0)); QVariant v8(takeItem(2, 1)); QVariant v9(takeItem(2, 2)); result=( v1.toInt()+v5.toInt()+v9.toInt() )+ ( v2.toInt()+v6.toInt()+v7.toInt() )+ ( v3.toInt()+v4.toInt()+v8.toInt() )- ( v3.toInt()+v5.toInt()+v7.toInt() )- ( v2.toInt()+v4.toInt()+v9.toInt() )- ( v1.toInt()+v6.toInt()+v8.toInt() ); } ... int main(int argc, char *argv[]) { ... /* тебе английским языком сказано, что нет у тебя такого конструктора */ //QTableWidget2 *tw=new QTableWidget2(table); QTableWidget2 *tw=new QTableWidget2(3, 3); //предварительно заполни таблицу ... //QTableWidget2::connect QObject::connect(&btn1, SIGNAL(clicked()), tw, SLOT(calculate())); QObject::connect(&btn2, SIGNAL(clicked()), tw, SLOT(generate())); QObject::connect(&btn3, SIGNAL(clicked()), tw, SLOT(clear())); QObject::connect(&btn4, SIGNAL(clicked()), &app, SLOT(quit())); wgt.show(); return app.exec(); } |
Сообщ.
#8
,
|
|
|
Я то видел надпись, что конструктор не тот и даже поглядев в ассистент создавал в унаследованном классе:
QTableWidget2 ( int rows, int columns, QWidget * parent = 0 ); Но оказывается конструктор для наследуемых классов нужно описывать как в твоем коде, то бишь: QTableWidget2 ( int rows, int columns, QWidget * parent = 0 ) : QTableWidget(rows,columns, parent) {} Все остальное тоже сделал как ты посоветовал, теперь самое время взяться за "бубен" (см. рис). P.S.: Видимо соединения объектов нужно прописать в конструкторе... щас буду пробовать! Прикреплённая картинка
|
Сообщ.
#9
,
|
|
|
В общем при таком раскладе все скомпилилось:
// MyTW2.h #include<QObject> #include<QTableWidget> class QTableWidget2 : public QTableWidget { Q_OBJECT // в принципе, этот макрос наследуется из QTableWidget public: QTableWidget2 ( int rows, int columns, QWidget * parent = 0 ) : QTableWidget(rows, columns, parent) {} int result; public slots: void clear(QTableWidget &); void generate(QTableWidget &); void calculate(); }; // main.cpp #include<QtGui> #include"MyTW2.h" // Инициализация массива нулями void QTableWidget2::clear(QTableWidget &table) { for(int i=0; i<table.rowCount(); i++) for(int j=0; j<table.columnCount(); j++) if (table.item(i,j)) { table.item(i,j)->setText("0"); } } //******************************************** // Заполнение массива псевдослучайными числами void QTableWidget2::generate(QTableWidget &table) { int x=0; qsrand(1); for(int i=0; i<table.rowCount(); i++) for(int j=0; j<table.columnCount(); j++) if (table.item(i,j)) { x=qrand(); QVariant v(x); QString s=v.toString(); table.item(i,j)->setText(s); } } //******************************************** // Вычисление определителя void QTableWidget2::calculate() { result=0; QVariant v1(takeItem(0, 0)); QVariant v2(takeItem(0, 1)); QVariant v3(takeItem(0, 2)); QVariant v4(takeItem(1, 0)); QVariant v5(takeItem(1, 1)); QVariant v6(takeItem(1, 2)); QVariant v7(takeItem(2, 0)); QVariant v8(takeItem(2, 1)); QVariant v9(takeItem(2, 2)); result=( v1.toInt()+v5.toInt()+v9.toInt() )+ ( v2.toInt()+v6.toInt()+v7.toInt() )+ ( v3.toInt()+v4.toInt()+v8.toInt() )- ( v3.toInt()+v5.toInt()+v7.toInt() )- ( v2.toInt()+v4.toInt()+v9.toInt() )- ( v1.toInt()+v6.toInt()+v8.toInt() ); } //******************************************** // Функция для изменения цвета ячейки void ColorCell(int i, int j, QColor color, QTableWidget &table, QTableWidgetItem &item) { QTableWidgetItem *newItem=new QTableWidgetItem(item); // Устанавливаем значение ячейки: newItem=table.takeItem(i, j); // Устанавливаем цвет ячейки QBrush b; b.setColor(color); newItem->setForeground(b); // Перепичываем заданную ячейку таблицы: table.setItem(i, j, newItem); } //******************************************** int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget wgt; wgt.setWindowTitle("Determinant Calculator"); wgt.resize(400, 250); QTableWidget table(3, 3); // создаем таблицу QTableWidgetItem item; // Заполняем таблицу: const char *values[3][3] = { { "1", "2", "3" }, { "4", "5", "6" }, { "7", "8", "9" } }; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) { QTableWidgetItem *item = new QTableWidgetItem(); item->setText(values[i][j]); // Устанавливаем ToolTip'ы для ячеек: item->setToolTip(values[i][j]); table.setItem(i, j, item); } QTableWidget2 *tw=new QTableWidget2(3, 3); tw->clear(table); // Изменяем цвета ячеек: /* ColorCell(1, 1, Qt::red, table, item); ColorCell(0, 0, Qt::blue, table, item); */ // Компоненты интерфейса: QVBoxLayout vbox; QHBoxLayout hbox1, hbox2; QPushButton btn1("&Calculate"); QPushButton btn2("&Generate"); QPushButton btn3("C&lear"); QPushButton btn4("&Exit"); hbox1.addWidget(&btn1); hbox1.addWidget(&btn2); hbox1.addWidget(&btn3); hbox1.addWidget(&btn4); QLabel lbl1("Determinant = "); QLabel lbl2("0"); lbl2.setNum(100/*det*/); hbox2.addStretch(); // Пружина слева hbox2.addWidget(&lbl1); hbox2.addWidget(&lbl2); hbox2.addStretch(); // Пружина справа vbox.addWidget(&table); vbox.addLayout(&hbox1); vbox.addLayout(&hbox2); wgt.setLayout(&vbox); // Соединения объектов: QObject::connect(&btn1, SIGNAL(clicked()), tw, SLOT(calculate())); QObject::connect(&btn2, SIGNAL(clicked()), tw, SLOT(generate(table))); QObject::connect(&btn3, SIGNAL(clicked()), tw, SLOT(clear(table))); QObject::connect(&btn4, SIGNAL(clicked()), &app, SLOT(quit())); wgt.show(); return app.exec(); } Но ни одна из кнопок не делает того что требуется (при нажатии на кнопки - ничего не происходит)... Щас буду пробовать исправить... |
Сообщ.
#10
,
|
|
|
Да тут надо сначала в конструкторе формы сделать
setupUi (this) connect (btn1, SIGNAL(clicked()), this, SLOT (slot1())); |
Сообщ.
#11
,
|
|
|
Все заработало!
|