Qt - Подключено, но не работает

У меня проблема с одним классом в моем проекте, после нажатия появляется новое окно с QTableWidget и QPushButton, после нажатия кнопки у меня должен быть "тест" на стандартном выходе, но ничего не отображается, вот части этого кода:

Заголовок:

class ClientsSelector : public QWidget {
Q_OBJECT

public:
ClientsSelector(InvoiceTab* parent);
QWidget *window;

private:
QPushButton *accept;

public slots:
void loadData();

Конструктор:

window = new QWidget();
layout = new QGridLayout();
layout->addWidget(table, 0, 0);

/*code*/

accept = new QPushButton(QString::fromUtf8("Load data"));
connect(accept, SIGNAL(clicked()), this, SLOT(loadData()));
layout->addWidget(accept, 0, 1);

/*code*/

window->setLayout(layout);

window->show();

Метод:

void ClientsSelector::loadData() {

QTextStream std(stdout);
std << "test" << endl;

}

У меня нет ни одного предупреждения или ошибки. У меня ничего нет на стандартном выходе, похоже, что кнопка была подключена к неправильному объекту (?)


person agilob    schedule 13.09.2012    source источник


Ответы (3)


Как создать экземпляр ClientsSelector? Разве это случайно не синглтон или глобальная переменная? Попробуйте переместить вызов connect в отдельную функцию инициализации, которая вызывается после конструктора ClientsSelector. Это помогло мне в подобных ситуациях WTF. Это как-то связано с тем фактом, что каждый наследник QObject имеет статический элемент метаданных, и вы не можете быть уверены в том, когда он будет полностью инициализирован, пока конструктор не завершит работу. connect не будет работать без этих метаданных.

См., например, здесь: http://www.qtcentre.org/threads/9479-connect-in-constructor

Если все еще потеряно, просмотрите этот контрольный список. Сигналы Qt настолько просты в использовании, что все иногда забывают, что у них также есть некоторые требования.

person Pavel Zdenek    schedule 13.09.2012

Похоже, вы забыли закрытие " на тестовой распечатке.

Попробуйте использовать

qDebug() << "test";

вместо QTextstream

person Kotte    schedule 13.09.2012
comment
Я сделал опечатку здесь в посте, в моем редакторе у меня есть "test" Редактировать: все еще ничего - person agilob; 13.09.2012
comment
Код мне кажется правильным. Вы уверены, что строка connect() запущена? Попробуйте добавить туда же распечатку и проверьте, что accept не является NULL или что-то в этом роде. - person Kotte; 13.09.2012
comment
Это работает в многопоточной программе? Есть некоторые проблемы при запуске нескольких потоков. Иногда вам нужно вызвать exec() в потоке, чтобы активировать цикл обработки событий. - person Kotte; 13.09.2012
comment
Запустили ли вы цикл событий в своем main() QCoreApplication app(argc, argv); app.exec(); - person Kotte; 13.09.2012
comment
Как я писал в верхнем посте, это дочерние окна, которые появляются после нажатия кнопки из родительского окна. У меня есть это. - person agilob; 13.09.2012

Вы можете сделать следующее, чтобы убедиться, что соединение установлено и слот вызывается.

  1. Функция connect возвращает статус соединения. Проверьте правильность подключения.
  2. поставьте точку останова и посмотрите, вызывается ли loadData() при нажатии кнопки.

Это может помочь найти причину.

person dev    schedule 14.09.2012