我试图将数据传递给屏幕上的mainwindow.cpp函数,典型的
ui->control->setText(消息)没有成功。如果它在计时器循环或按钮函数中,但不在display_that_data函数
"MainWindow::display_that_data()"从myudp.cpp调用,代码如下
MainWindow show_tlm;
show_tlm.display_that_data(data_source, buf_copy);
mainwindow.cpp(更新为包括为signal/SLOT连接发出信号)SIGNAL/SLOT连接在构造函数中使用以下行
建立 connect (this, SIGNAL (showdata_signal()), this, SLOT(showdata_slot()));
void MainWindow::display_that_data(QByteArray data_source, QByteArray tlmBuf){
QString msg ;
msg = " in display_that_data";
qDebug() << msg ;
ui->tlm_vals->setText(msg);
//generate a signal which will trigger showdata_slot
emit showdata_signal();
msg = " in display_that_data after emit showdata_signal()";
qDebug() << msg ;
}
void MainWindow::showdata_slot() {
QString msg = "showdata_slot called";
qDebug() << msg ;
ui->tlm_vals->setText(msg);
}
运行时调试消息显示代码正在写入showdata_slot,但它仍然没有写入ui->tlm_vals
" in display_that_data"
"showdata_slot叫做"
"在display_that_data后发出showdata_signal()"
但是…ui->tlm_vals->setText(msg)行都没有在ui
上放置文本。"MainWindow::realtimeDataSlot()"被定时器超时信号调用,如下所示:
void MainWindow::setupRealtimeDataDemo(QCustomPlot *customPlot) {
// setup a timer that repeatedly calls MainWindow::realtimeDataSlot
connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
dataTimer.start(1000);
}
void MainWindow::realtimeDataSlot(){
QString temp = QString("%1").arg(epochTime, 10, 10, QChar('0'));
ui->tlm_vals->setText(temp);
}
这个工作完美(当然我必须禁用它,看看是否showdata_slot写入ui)
我认为问题是需要一个信号和插槽连接来触发写入ui,但生成一个信号/插槽连接(调试显示为工作)仍然不会从插槽功能写入ui。
为了完整起见,mainwindow.h包含以下
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void setupRealtimeDataDemo(QCustomPlot *customPlot);
void display_that_data (QByteArray data_source, QByteArray tlmBuf);
private slots:
void realtimeDataSlot();
void showdata_slot();
private:
Ui::MainWindow *ui;
QTimer dataTimer;
我错过/做错了什么?
在Qt中的某个地方,gui鼠标点击生成的事件和代码生成的事件之间存在差异,这在某种程度上导致Qt的行为随着同一行代码而变化。关于这个话题,我会再发一个更"根级"的问题。