c++/qt 无法调用另一个cpp的函数

代码详情在图中。
图片说明

main.cpp:
error: undefined reference to `InsertS(char*, char*, int, int)'

widget.cpp:
error: undefined reference to `GetS(char*, char*, char*)'

collect2.exe:-1: error: error: ld returned 1 exit status

4个回答

类型的成员函数需要使用对象去调用,main函数的中的正确调用应该是

 BFunction bf;
 bf.InsertS(First, Second, dis, num)

或者把InsertS声明成静态函数

 static void InsertS(char A[], char B[], int C, int D)

然后在main函数中这么调用

 BFuction::InsertS(First, Second, dis, num);

类的成员函数需要通过类对象去调用,不能这样直接用的,除非你把类的成员函数声明成静态的,这样其他地方用就可以直接 类名::函数名 来调用

简单描述问题就是:
在**my_file.h**,**my_file.cpp**中声明定义过一个函数,
在其他的cpp中,即使写了**#include "my_file.h" 或者 **extern .......(该函数)
也还是出现 underfined reference to (该函数)的错误

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++/qt 无法调用另一个cpp的函数
代码详情在图中。 ![图片说明](https://img-ask.csdn.net/upload/201610/08/1475903050_94562.jpg) main.cpp: error: undefined reference to `InsertS(char*, char*, int, int)' widget.cpp: error: undefined reference to `GetS(char*, char*, char*)' collect2.exe:-1: error: error: ld returned 1 exit status
求教QT中一个类的函数怎样才能调用另一个类的函数
在fivescene.h文件中已经声明class FiveScene : public QWidget; 然后UI中的Widget也是服从这个类的调用; 我想在让mainwndow.h(头文件中已经include)负责整个界面上的按钮的操作,然后有个重新开始的按钮clicked(),我希望使得Widget界面清空; 但在实际操作中,并没有调用到FiveScene类下面的init()函数,求教应该怎么变动 (编译已通过,部分相关代码如下) mainwindow.h(已经#include "fivescene.h") namespace Ui { class MainWindow; } class FiveScene; class MainWindow : public QMainWindow {……private:FiveScene *a;……} mainwindow.cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); a = new FiveScene(); } void MainWindow::on_pushButton_1_clicked() { a->init(); } 在fivescene.h中已经声明init();在fivescene.cpp中也已经实现并且没有问题 求教!!
qt中自定义槽函数怎么调用该类中的控件指针
就是想把lineEdit里面的值在slider里面显示, 就是在我自定义的槽函数里面调用了构造函数中的控件指针,结果显示的是野指针,请问我应该怎么改 部分代码如下: ``` //widget.h class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); QSlider *slider; QLineEdit *edit; public slots: void ChangeValue(); }; ``` ``` //widget.cpp 控件的布局什么的,还定义了一个定时器,定时触发槽函数 Widget::Widget(QWidget *parent) : QWidget(parent) { QLineEdit *edit = new QLineEdit("25"); QSlider *slider = new QSlider(Qt::Vertical); slider->setRange(0,100); slider->setValue(0); slider->setTickPosition(QSlider::TicksLeft); QLabel *label = new QLabel("0"); QHBoxLayout *cLayout = new QHBoxLayout; cLayout->addWidget(label,0,Qt::AlignRight); cLayout->addWidget(slider,0,Qt::AlignLeft); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(edit); mainLayout->addLayout(cLayout); setLayout(mainLayout); slider->setFocus(); QTimer *timer1 = new QTimer(); timer1->setInterval(500); timer1->start(); connect(slider,SIGNAL(valueChanged(int)),label,SLOT(setNum(int))); connect(timer1,SIGNAL(timeout()),this,SLOT(ChangeValue())); } Widget::~Widget(){} void Widget::ChangeValue(){ QString s = edit->text(); int value = s.toInt(); slider->setValue(value); } ```
C++ QT 运行时错误read access violation
void AccountWindow::displayEvent(const QDate &curDate) { QFile file(filename); file.open(QIODevice::ReadOnly); QDataStream in(&file); while(!in.atEnd()) { Event *p = new Event; in.readRawData((char *)p, sizeof(Event)); if (p->getStartDate() == curDate) { QString strEvent; strEvent = p->getStartDate().toString("MM.dd") + p->getStartTime().toString("h:m") + " - " + p->getEndDate().toString("MM.dd") + p->getEndTime().toString("h:m") + " " + p->getTitle() + '\n'; //此处调用函数 ui->textBrowser->append(strEvent); } } //Event.cpp QString Event::getTitle() { return title; //此处有错误 } 底层停止了因为它触发了一个异常。 在线程0中停止,因为: Exception at 0x744dc25a, code: 0xc0000005: read access violation at: 0x0, flags=0x0。
qt 运行出来的框图有残缺
# cpp文件 ``` #include "vsbak.h" #include "ui_vsbak.h" #include <QSettings> #include <QFileDialog> #include<QTime> #include<QtDebug> #include <QMessageBox> #define CONFIG_FILE "config.ini" const QString EXCLUDE_FILE = "/home/hu/project2";// 這個文件沒啥用 Vsbak::Vsbak(QWidget *parent) : QWidget(parent) , ui(new Ui::Vsbak) { ui->setupUi(this); QSettings *configIniRead = new QSettings(CONFIG_FILE, QSettings::IniFormat); dir_src = configIniRead->value("/main/bak_src").toString(); dir_dest = configIniRead->value("/main/bak_dest").toString(); // 配置文件里面有目标地址 gpg_key = configIniRead->value("/main/gpg_key").toString(); exclude_from = configIniRead->value("exclude/exclude").toString(); delete configIniRead; // init bash terminal //QProcess可以用于启动外部程序 cmd = new QProcess(this);// 因为与父类直接释放内存 // Sets the working directory to dir. QProcess will start the process in this directory. //The default behavior is to start the process in the working directory of the calling process. cmd->setWorkingDirectory(dir_src); //This signal is emitted when the process has made new data available //through its standard output channel (stdout). It is emitted regardless of the current read channel. connect(cmd, &QProcess::readyReadStandardOutput, this, &Vsbak::on_readyReadStandardOutput); connect(cmd, &QProcess::readyReadStandardError, this, &Vsbak::on_readyReadStandardError); ui->lineEdit->setText(dir_src); ui->lineEdit_2->setText(dir_dest); // 在ui里直接设置这个地址 // init comboBox init_comboBox(); // init radiobutton: choice full ui->radioButton->setChecked(true); ui->checkBox->setChecked(false); ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } /* * 设置最大可见数目为5,是不是不合理? */ void Vsbak::init_comboBox() // 找压缩好的文件 Combobox 下拉菜单 { /* * 1. 用一个对象进入dir-dest目录下 * 2. 过滤掉包含后追的文件 * 3. 获取被过滤的文件理解 */ // find all backup.tar.gz files //The QDir class provides access to directory structures and their contents. 不仅能看到结构,还可以看到目录 QDir *curDir = new QDir(dir_dest); //The QStringList class provides a list of strings. //可以让你提取一个新的列表只包含这些字符串包含一个特定的字符串(或匹配特定正则表达式) QStringList filter; // 过渡成一个目录 filter << "*.tar.gz" << "*.tar.gz.gpg"; curDir->setNameFilters(filter); // 过滤掉特定的目录下的文件 //Returns a list of QFileInfo objects for all the files and directories in the directory //QDir::entryInfoList()会获取该目录下所有目录和文件的QFileInfo对象的列表 QList<QFileInfo> *tarFileInfo = new QList<QFileInfo>(curDir->entryInfoList(filter)); /* * dir_dest 里面存放的其实都是被压缩的文件,所以用上面的后缀直接进行过滤 * 1. 设置最大的可见数目为5 * 2. 看目录里面有多少,然后放入这个comboBox * 3. 获取被过滤的文件 * 4. 按照顺序放入到combobox中 */ ui->comboBox->clear(); ui->comboBox->setMaxVisibleItems(5); // 最大可见数目 5 //The string will be inserted as the first item in the combobox. ui->comboBox->setInsertPolicy(QComboBox::InsertAtTop); for (int i=0; i< tarFileInfo->count(); i++)// count()只是计算里面的数量,tarFileinfo实际上是一个文件列表 ui->comboBox->addItem(tarFileInfo->at(i).fileName()); } Vsbak::~Vsbak() { delete ui; // 有何作用 if(cmd->state() == QProcess::Running){ cmd->terminate(); cmd->waitForFinished(); } } void Vsbak::on_readyReadStandardOutput() { // QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); // ui->label_4->setText(out); } void Vsbak::on_readyReadStandardError() { QMessageBox::information(0, "Error", cmd->readAllStandardError()); } // change dir_src void Vsbak::on_toolButton_clicked() { /* * 1. 或许dir_src的文件目录名称 * 2. 将dir_src的文件目录名写到lineEdit上面 * 3. 更新配置文件里面的信息 * 4. 设置工作目录 * */ QString dirname; dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_src, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_src = dirname; ui->lineEdit->setText(dir_src); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_src", dir_src); delete configIniWrite; cmd->setWorkingDirectory(dir_src); ui->label_4->setText("change source dir sucess!"); } } // change dir_dest void Vsbak::on_toolButton_2_clicked() { QString dirname; // getExistingDirectory 只获取文件夹 dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_dest, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_dest = dirname; ui->lineEdit_2->setText(dir_dest); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_dest", dir_dest); delete configIniWrite; ui->label_4->setText("change dest dir sucess!"); } } int Vsbak::get_min(QDateTime curTime) { QSettings *configIniReadWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); int lastTime = configIniReadWrite->value("/main/last_time").toInt();// 将值转化成整形 configIniReadWrite->setValue("/main/last_time", curTime.toTime_t()); delete configIniReadWrite; int minDiff = (curTime.toTime_t()-lastTime) / 60 + 1; return minDiff; } void Vsbak::on_checkBox_clicked() { if(ui->checkBox->isChecked()){ ui->checkBox_2->setEnabled(true); ui->checkBox_3->setEnabled(true); } else{ ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } } /* * 3 个 String类型 * targz:time + full.tar.gz * cmd_find:find ./ -type f | grep -v \'Permission denied\' > TEPLIST * cmd_tar *目录列表 * * * */ void Vsbak::on_pushButton_clicked(){ // The QDateTime class provides date and time functions. // 调用QDatetime里面的一个函数,赋给另一个QDatetime的类型 QDateTime current_date_time = QDateTime::currentDateTime(); // 初始化三个String类型 QString targz, cmd_find, cmd_tar; //RadioButton presents an option button that can be toggled on (checked) or off (unchecked). //Radio buttons are typically used to select one option from a set of options. //Use isChecked() to see if a particular button is selected. if(ui->radioButton->isChecked()){ // 如果radiobutton 被选择了,那么就进行备份,如果没有就只输出时间 // Linux find命令用来在指定目录下查找文件。 // 将目前目录其其下子目录中所有一般文件列出 # find . -type f // Linux grep 命令用于查找文件里符合条件的字符串。 // -v 或 --revert-match : 显示不包含匹配文本的所有行。 // 反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。 // ./ 表示当前目录的全路径 当前目录的全路径 没有这个 \'Permission denied\'???? //linux的命令,查找文件然后设置权限 // 这个是不管修改不修改,全部列出来 cmd_find = "find ./ -type f | grep -v \'Permission denied\' > TEPLIST";// 这个功能是什么呢 targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".full.tar.gz"; }else{ // 会替换掉前面的百分之1,替换规则是从小到大 //get_min是一个函数,看它具体怎么实现的,应该是循环遍历了current_date_time,找到最小???? int minDiff = get_min(current_date_time); // 获得是最小的查值 // 完成命令,把距离最新一次全部修改的文件单独列出来 cmd_find = QString("find ./ -mmin -%1 -type f | grep -v \'Permission denied\' > TEPLIST").arg(minDiff); targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".inc.tar.gz"; } // exclude from 是一个配置目录 // tar命令 //-v或--verbose 显示指令执行过程 // --totals 备份文件建立后,列出文件大小 //cmd_tar这是压缩tar的linux命令,将exclude里面的文件全部列出来,进行压缩 cmd_tar = QString("tar --verbose --totals --exclude-vcs %1 --files-from=TEPLIST -czf %2/%3").arg(exclude_from).arg(dir_dest).arg(targz);//?5 // 向调试器输出命令的执行结果,方便调试排错 qDebug()<< cmd_find << endl << cmd_tar<< endl; // 下面整个过程就是执行这个命令 QStringList cmd_pipe;// 初始化了一个String目录 cmd_pipe << "-c" << cmd_find; // 说明这个cmd-pipe已经变成了一个linux的cmd命令了 cmd->start("/bin/bash",cmd_pipe); // 开始一个程序 cmd->waitForFinished(); cmd->close(); cmd->start(cmd_tar);// cmd_tar 也变成了一个程序 cmd->waitForFinished(); cmd->close(); cmd->start("rm -f TEPLIST");// 强制删除teplist, teplist 就是临时文件 cmd->waitForFinished(); /*********** Encrypting*************/ // gpg-k 增加公共钥匙 if(ui->checkBox->isChecked()){ QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput());// 这个输出就不是很理解为什么 if(out.isEmpty()) // -o, --output FILE write output to FILE // c 说是使用对称加密,看起来很奇怪 cmd_enc = QString("gpg -c -o %1/%2.gpg %1/%2").arg(dir_dest).arg(targz); else // e 是加密数据 , 针对 用户 id 进行加密 cmd_enc = QString("gpg -e -r %1 -o %2/%3.gpg %2/%3").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); if(false == ui->checkBox_2->isChecked()){ QString cmd_rm = QString("rm %1/%2.gpg").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } if(false == ui->checkBox_3->isChecked()){ QString cmd_rm = QString("rm %1/%2").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } /* * /home/hu/桌面/vsbak/backup/2019-11-13_19.38.57.full.tar.gz * */ // ui->comboBox->addItem(targz); init_comboBox(); } } void Vsbak::on_pushButton_2_clicked(){ QString targz = ui->comboBox->currentText(); if (targz.endsWith(".tar.gz.gpg")){ targz = targz.remove(".gpg"); QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); if(out.isEmpty()) cmd_enc = QString("gpg -d -o %1/%2 %1/%2.gpg").arg(dir_dest).arg(targz); else cmd_enc = QString("gpg -d -r %1 -o %2/%3 %2/%3.gpg").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); } QString cmd_str = QString("tar -xvf %1/%2").arg(dir_dest).arg(targz); qDebug() << cmd_str; cmd->start(cmd_str); cmd->waitForFinished(); } ``` 上面是cpp文件 下面是 # h文件 #ifndef VSBAK_H #define VSBAK_H #include <QWidget> #include<QProcess> QT_BEGIN_NAMESPACE namespace Ui { class Vsbak; } QT_END_NAMESPACE class Vsbak : public QWidget { Q_OBJECT public: Vsbak(QWidget *parent = nullptr); ~Vsbak(); private slots: void on_readyReadStandardOutput(); void on_readyReadStandardError(); void on_toolButton_clicked(); void on_toolButton_2_clicked(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_checkBox_clicked(); private: Ui::Vsbak *ui; QProcess *cmd; QString dir_dest; QString dir_src; QString gpg_key; QString exclude_from; void init_comboBox(); int get_min(QDateTime curTime);// 获得整形 }; #endif // VSBAK_H 我运行之后出来的qt界面,原本是可以下拉选择的,但是都没有反映,这是为啥
Qt加载dll文件后在JavaScript中无法使用
**实现目的:**在Qt加载dll文件,dl文件实现提示框功能,dll文件的类为Operator,加载后作用js的一个属性被js使用。 **问题:**在js中就不能成功调用,并提示: Uncaught exception at :/test.js:6: TypeError: Result of expression 'Operator.prompt' [undefined] is not a function. ![图片说明](https://img-ask.csdn.net/upload/201509/25/1443159957_424987.png) 尝试在main.cpp中调用这个类的函数: ope->prompt("Title","this is a Message","YesNoCancel"); 可以正常调用。 确定设置Operator类的实例ope为JavaScript的属性的代码是没问题的: scriptWidget[1] = engine->newQObject(ope); engine->globalObject().setProperty("Operator", scriptWidget[1]); 我就觉得奇怪,怎么在main.cpp中可以正常调用,而设置到JS中就不能调用了呢?
win7下 qt5.5版本 链接一个自己写的lib静态库生成另一个静态库失败
hi 各位大神 小弟遇到一个很奇怪的问题, 我自己用vs生成一个静态库a.lib, 用qt 再生成一个b.lib (链接a.lib) 再主程序中调用b.lib链接的时候,提示找不到a.lib中的函数 #include "libtof.h" #include "lusb0_usb.h" //#pragma comment(lib,".\\libusb0d.lib") LibTof::LibTof() { } int LibTof::add() { usb_init(); return 2; } .pro #------------------------------------------------- # # Project created by QtCreator 2018-03-14T11:17:16 # #------------------------------------------------- QT -= gui QMAKE_CFLAGS_RELEASE += /MT QMAKE_CXXFLAGS_RELEASE += /MT QMAKE_CFLAGS_DEBUG += /MTd QMAKE_CXXFLAGS_DEBUG += /MTd CONFIG(debug,debug|release) { QMAKE_LFLAGS += /NODEFAULTLIB:\"LIBCMTD.lib\" } else { QMAKE_LFLAGS += /NODEFAULTLIB:\"LIBCMT.lib\" } TARGET = libTof TEMPLATE = lib CONFIG += staticlib CONFIG += dll debug warn_on SOURCES += libtof.cpp HEADERS += libtof.h unix { target.path = /usr/lib INSTALLS += target } win32:CONFIG(release, debug|release): LIBS += -L$$PWD/./ -llibusb0 else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/./ -llibusb0d INCLUDEPATH += $$PWD/. DEPENDPATH += $$PWD/. win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/./liblibusb0.a else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/./liblibusb0d.a else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/./libusb0.lib else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/./libusb0d.lib 在vs2013中编译,出错 错误 1 error LNK2019: 无法解析的外部符号 _usb_init,该符号在函数 "public: int __thiscall LibTof::add(void)" (?add@LibTof@@QAEHXZ) 中被引用 d:\UserData\my documents\visual studio 2013\Projects\qtlibTest\qtlibTest\libTof.lib(libtof.obj) qtlibTest _usb_init这个就是第一个lib库中的函数 而且我发现 我用vs生成b.lib的时候, 大小是400Kb 用qt生成的b.lib 只有25Kb 我怀疑是qt中的vs编辑器没有把a.lib真正的导入进去,只是加载了静态符号。 求大神解答
Qt中 QSqlQuery构造函数失败
databaseOP.h : ``` class databaseOP { public: databaseOP(QString hostname);//构造函数,打开指定hostname的数据库 ~databaseOP();//析构函数,按情况释放数据库连接。 bool ex01();//执行存储过程,在数据库里追加新记录。 void getDB();//查询 private: QSqlDatabase lk; bool lkResult ; QSqlQuery query; } ``` databaseOP.cpp : ``` databaseOP::databaseOP(QString hostname) { lk=QSqlDatabase::addDatabase("QMYSQL"); lk.setUserName("root"); lk.setPort(3306); lk.setHostName(hostname); lk.setDatabaseName("changelog"); lkResult =lk.open(); if(lkResult) { qDebug()<<"数据库连接成功建立"; query=QSqlQuery::QSqlQuery(lk);//出错connot call constructor } else { qDebug()<<"数据库连接建立失败"; } } databaseOP::~databaseOP() { if(lkResult) { qDebug()<<"因为连接成功,因此结束时需要释放数据库连接"; lk.close(); } } bool databaseOP::ex01() { query.exec("call test()"); } void databaseOP::getDB() { query.exec("select * from ttable"); while (query.next()) { qDebug()<<query.value(0).toString()<<query.value(1).toString(); } } ``` **在调用QSqlQuery 类的构造函数时出错** 这要怎么弄??
QT5信号槽绑定成功后,为什么槽函数没有执行?求解
我是在list类中做了一个界面,并绑定类槽函数;然后加到类mainwindow中,但是槽函数没有执行,但是connect返回值true说明已经办定成功了啊?为什么没有执行呢?槽函数我也声明了,初学者求拍醒啊。。。 我贴上源码吧! // 这是类list的: //----------------------------list.h #ifndef LIST_H #define LIST_H #include <QListView> #include <QStringListModel> #include <QStringList> #include <QWidget> #include <QPushButton> #include <QLineEdit> class list : public QWidget { Q_OBJECT public: list(); QStringListModel *ml; QListView *vl; QPushButton *btn_insert; QPushButton *btn_remove; QWidget *qw; QWidget *addUI(); QLineEdit *line; public slots: void l_insert(); }; #endif // LIST_H //----------------------------list.cpp list::list() { ml=new QStringListModel; vl=new QListView; btn_insert=new QPushButton("插入"); btn_remove=new QPushButton("删除"); qw=new QWidget; line=new QLineEdit("insert:"); bool a=connect(btn_insert,SIGNAL(clicked()),this,SLOT(l_insert())); qDebug()<<a<<endl; } QWidget * list::addUI(){ QStringList str; str<<"通道1"<<"通道2"; ml->setStringList(str); vl->setModel(ml); QHBoxLayout *h1=new QHBoxLayout; QFormLayout *f1=new QFormLayout; h1->addWidget(btn_insert); h1->addWidget(btn_remove); f1->addRow(vl); f1->addRow(line); f1->addRow(h1); qw->setLayout(f1); return qw; }; void list::l_insert(){ qDebug()<<"@@@@@"; QString str=line->text(); qDebug()<<"str"<<endl; int row=vl->currentIndex().row(); QModelIndex index=ml->index(row); ml->setData(index,str); vl->setCurrentIndex(index); vl->edit(index); }; mainwindow.cpp // 只是调用此界面 tab=new QTabWidget; QWidget *w1=new QWidget; list l1; w1=l1.addUI(); tab->addTab(w1,"QList"); setCentralWidget(tab);
QT里关于QTextEdit控件的信号问题,求解答
一个项目出现BUG百思不得其解,经过很多排除,最后锁定原因所在,问题的关键在于如下: QTEXTEDIT控件自身带有textChanged()信号,当文本改变时会发射此信号,可是,问题 出现了!!经过很多次的尝试,发现在控件里正常输入字符的时候,信号会正常发射 一次(调用了连接到此信号的一个槽函数一次),可是!!!当删除某个字符(BACKSPACE键),莫名其妙竟然会发射textChanged()信号两次(槽函数被调用了两次)!!!!!! 就是这个问题导致了最终BUG的出现。 为了排除,我又写了一个最基本的示例,MAINWINDOW里只有一个控件QTextEdit, 相应的槽函数里只简单弹出一个QMESSAGEBOX,换了一台机器,换了一个版本的QT, 依然如此,正常输入时函数被调用一次,删除的话就会调用两次,代码和界面截图如下,请大牛帮解释这是为何?如何解决?感谢!!! CPP文件代码![图片说明](https://img-ask.csdn.net/upload/201604/29/1461891982_366124.jpg) h文件代码 ![图片说明](https://img-ask.csdn.net/upload/201604/29/1461891994_516944.jpg) 界面截图 ![图片说明](https://img-ask.csdn.net/upload/201604/29/1461892004_105393.jpg)
Qt 点击运行,QT显示“应用程序输出”,但是没有窗口显示,但任务管理器里有运行
本来是可以运行的,但是我添加了几个已有项 .h和.cpp 然后在运行就出现这种情况了,我用vb来做也是这样,(原来的.h和.cpp是可以在C++的main函数调用,在小黑框正常运行的)
QT怎么快速实现走动棋子
widget的cpp文件内容 static int m=1,n=1;     for(int i=0;i<=9;i++){         for(int j=0;j<=9;j++){             pbDifineGroup[j+1][i+1] = pbDifine=new   QPushButton(this);             pbDifine->setGeometry(lbegin+sline*i,60+sline*j,sline,sline);//连续生成按钮             connect(pbDifineGroup[j+1][i+1],SIGNAL(clicked()),this,SLOT(slotMove(m,n)));             pbDifine->setFlat(true);//设置按钮透明             n++;         }         m++;     } 有疑惑的槽函数内容 void Widget::slotMove(int,int) {     pbMoveBlue1->setGeometry(pbDifineGroup[m][n]->geometry());//pbMoveBlue1是其中一颗棋子 } 写出来的界面就是图片那样 然后发现在链接信号和槽的时候槽函数好像并不会被调用,只是建立了一个关系,(把槽函数里面的m,n换成了常数发现棋子可以移动),但是用m,n的时候不管点击哪一个格子棋子都没有反应了,本来想用多个信号连接一个槽函数但是实现不同的槽机制的,但是找不到办法,求大神解救。![图片](https://img-ask.csdn.net/upload/201603/22/1458626103_86213.png)
QT 多线程TCP通讯问题 程序异常退出
我在运行过一个网上下载的多线程服务器后,我自己写的单线程的客户端和服务端就不再连的上了, 我百度了一下说是可能是因为我多次调用了connectToHost,所以点击连接时程序会异常退出,但这个问题怎么解决呢?因为我现在是换了端口也连不上了。 错误提示我也没弄懂,这个函数在cpp里写了呀 ![图片说明](https://img-ask.csdn.net/upload/201908/23/1566529412_850530.png) 找到的解决方法说减少次数,可是我现在根本就连不上了。之前连的也不知道怎么删除。。。 ![图片说明](https://img-ask.csdn.net/upload/201908/23/1566528556_717591.png)
qt 使用select监听串口时主线程被阻塞
在QT中,另起一个线程读串口,使用select监听的,可是为什么主线程也被阻塞了呢? 代码如下: thread.h ``` #ifndef DISTANCE_SERIAL_PORT_H #define DISTANCE_SERIAL_PORT_H #include <QtCore/QThread> class Distance_serial_port : public QThread { Q_OBJECT public: explicit Distance_serial_port(QObject *parent = 0); void run(); void run_once(); void setTermios(struct termios * pNewtio, int uBaudRate); void gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio); }; #endif // DISTANCE_SERIAL_PORT_H ``` thread.cpp ``` #include "distance_serial_port.h" #include <sys/time.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <assert.h> #include <iostream> #include <termios.h> #define BUF_LENGTH 6 #define DEV_NAME "/dev/tty" Distance_serial_port::Distance_serial_port(QObject *parent) : QThread() {} class CLASS_JULI{ public: CLASS_JULI(int f = -1):fd(f){ } ~CLASS_JULI() { close(fd); } int fd; }; CLASS_JULI dis_port_fds; void Distance_serial_port::run(){ while(1) { try{ run_once(); } catch(...){ std::cerr<<"distance serial port run throw exception!"<<std::endl; } sleep(1); } } void Distance_serial_port::run_once() { int ret = 0,i; unsigned char buf_read[BUF_LENGTH]; fd_set readfd; struct timeval timeout; struct termios oldtio, newtio; dis_port_fds.fd= open(DEV_NAME,O_RDONLY | O_NONBLOCK); if ((dis_port_fds.fd = open(DEV_NAME, O_RDONLY | O_NONBLOCK)) <= 0) { std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl; return ; } else { std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl; } gps_uart_init(dis_port_fds.fd,&oldtio,&newtio); assert(dis_port_fds.fd>0); while(1) { timeout.tv_sec=1; timeout.tv_usec=0; FD_ZERO(&readfd); FD_SET(dis_port_fds.fd,&readfd); ///监控函数 ret=select(dis_port_fds.fd+1,&readfd,NULL,NULL,&timeout); if(ret == -1) //错误情况 { std::cout<<"error"<<std::endl ; } else if(ret>0) //返回值大于0 有数据到来 { if(FD_ISSET(dis_port_fds.fd,&readfd)) { i=read(dis_port_fds.fd,buf_read,BUF_LENGTH); std::cout<<"----------------------------------------"<<std::endl; int m = 0; for(m = 0; m < BUF_LENGTH ; m++) { std::cout<<buf_read[m]<<" "<<std::endl; } if(buf_read[0] == 'D') { char _buf = buf_read[1]; //QBitArray ba(8); if( (_buf&0x80) == 1 ) { } else { } } break; } else //超时情况 { std::cout<<"time out"<<std::endl; continue; } } else { } } } void Distance_serial_port::setTermios(struct termios * pNewtio, int uBaudRate) { /* *clear struct for new port settings */ bzero(pNewtio, sizeof(struct termios)); //8N1 pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL; pNewtio->c_iflag = IGNPAR; pNewtio->c_oflag = 0; pNewtio->c_lflag = 0; //non ICANON } /* *设置串口的波特率9600,并刷新使其立即生效 */ void Distance_serial_port::gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio) { tcgetattr(ttyFd, oldtio); /* save current serial port settings */ setTermios(newtio, B115200); tcflush(ttyFd, TCIFLUSH); tcsetattr(ttyFd, TCSANOW, newtio); } ``` 调用方法 ``` dis_serial_prot = new Distance_serial_port(); dis_serial_prot->run(); ``` 为什么呢?难道在QT中不能使用select?
QT 写的读写配置的程序,写INI文件重启后还原, 用VI打开后重启就不还原
#include "config.h" #include <QtCore/QtCore> #include <QDebug> Config::Config(QString qstrfilename) { if (qstrfilename.isEmpty()) { m_qstrFileName ="Config.ini"; //QCoreApplication::applicationDirPath() + "/Config.ini"; } else { m_qstrFileName = qstrfilename; } m_psetting = new QSettings(m_qstrFileName, QSettings::IniFormat); qDebug() << m_qstrFileName; } Config::~Config() { delete m_psetting; m_psetting = 0; } void Config::Set(QString qstrnodename,QString qstrkeyname,QVariant qvarvalue) { m_psetting->setValue(QString("/%1/%2").arg(qstrnodename).arg(qstrkeyname), qvarvalue); m_psetting->sync(); // sync(); qDebug() << QString("/%1/%2").arg(qstrnodename).arg(qstrkeyname)+ qvarvalue.toString(); } QVariant Config::Get(QString qstrnodename,QString qstrkeyname) { QVariant qvar = m_psetting->value(QString("/%1/%2").arg(qstrnodename).arg(qstrkeyname)); return qvar; } 用的是一个大神写的config.cpp , 主函数 调用 Config().Set("COMMON","IP",CGlobal::IP); Config().Set("COMMON","Port",CGlobal::Port); Config().Set("COMMON","IP1",CGlobal::IP1); Config().Set("COMMON","Port1",CGlobal::Port1); 写应该是写进去了。因为把程序关闭后 用VI打开 ini文件 是可以看到已经修改了,如果不用VI打开重启后就又还原了。用VI打开后 再重启 就不会还原。现象就是像没保存一样。各位大神有没有遇见过的 指导下
QThread: Destroyed while thread is still running
最近发现代码有问题 QThread: Destroyed while thread is still running 线程snap_thread.cpp ``` Snap_thread::Snap_thread(QLabel *pb) :QThread() { isRunning = true; udp_fd = -1; this->pb = pb; } void Snap_thread::run() { run_socket(); } void Snap_thread::run_socket() { int len; char sendbuf[256]; //sendto中使用的对方地址 struct sockaddr_in toAddr; //在recvfrom中使用的对方主机地址 struct sockaddr_in fromAddr; unsigned int fromLen; char recvBuffer[128]; udp_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(udp_fd < 0) { printf("创建套接字失败了.\r\n"); return; } //memset()函数 memset(&toAddr,0,sizeof(toAddr)); toAddr.sin_family=AF_INET; //对方的地址和对方的主机port toAddr.sin_addr.s_addr=inet_addr("127.0.0.1"); toAddr.sin_port = htons(this->port); sendbuf[0]=0x1; if(flag_video_press_num == GUIONTIMEONE) { str = qpath; str += "/car.jpg"; } else if(flag_video_press_num == GUIONTIMETWO) { str = qpath; str += "/goods.jpg"; } strcpy(&sendbuf[1],path); if((len=sendto(udp_fd,sendbuf,strlen(path)+2,0,(struct sockaddr*)&toAddr,sizeof(toAddr))) != strlen(path)+2) { printf("sendto() 函数使用失败了.\r\n"); } printf("%d has sent %d bytes\n",this->port,len); fromLen = sizeof(fromAddr); if(recvfrom(udp_fd,recvBuffer,128,0,(struct sockaddr*)&fromAddr,&fromLen)<0) { printf("recvfrom()函数使用失败了.\r\n"); } if(recvBuffer[0] == 2) { if(recvBuffer[1] == 1) { this->pb->setText("截图成功"); } else if(recvBuffer[1] == -1) { this->pb->setText("文件名错误"); } else { this->pb->setText("存储错误"); } } close(udp_fd); udp_fd = -1; } Snap_thread::~Snap_thread(){} void Snap_thread::setPort(int port) { this->port = port; } void Snap_thread::setPath(QString path) { this->qpath = "/mnt/ftp/"; qpath += path; } void Snap_thread::stop() { std::cout<<"this is stop!"<<std::endl; this->isRunning = false; if(udp_fd >= 0) { close(udp_fd); } this->quit(); } ``` 在主线程调用代码如下 ``` snap = new Snap_thread(ui->label_toast); snap->setPort(6000); snap->setPath(snap_save_path); snap->start(); ... if(snap->isRunning) { snap->stop(); delete snap; snap = NULL; } ``` 现在报 QThread: Destroyed while thread is still running 还有可能直接导致程序崩溃,我应该如何改成呢?
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
说实话,对于学习路线这种文章我一般是不写的,大家看我的文章也知道,我是很少写建议别人怎么样怎么样的文章,更多的是,写自己的真实经历,然后供大家去参考,这样子,我内心也比较踏实,也不怕误导他人。 但是,最近好多人问我学习路线,而且很多大一大二的,说自己很迷茫,看到我那篇 普普通通,我的三年大学 之后很受激励,觉得自己也能行,(是的,别太浪,你一定能行)希望我能给他个学习路线,说...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
小白学 Python 爬虫(25):爬取股票信息
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
4岁小女孩给Linux内核贡献提交
今天在reddit上看到一个有趣的讨论,一个4岁的小女孩给Linux提交了一个补丁,并且这个补丁合并到了代码中。链接如下:https://www.reddit.com/r/linux/c...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
2019年还剩1天,我从外包公司离职了
这日子过的可真快啊,2019年还剩1天,外包公司干了不到3个月,我离职了
我一个37岁的程序员朋友
周末了,人一旦没有点事情干,心里就瞎想,而且跟几个老男人坐在一起,更容易瞎想,我自己现在也是 30 岁了,也是无时无刻在担心自己的职业生涯,担心丢掉工作没有收入,担心身体机能下降,担心突...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
计算机电子书 2019 归档
2017 运营技能成长地图 Gitee 下载 Github 下载 SourceForge 下载 5 分钟商学院精细笔记 000_185 Gitee 下载 Github 下载 SourceForge 下载 A Comprehensive Guide to Machine Learning (UCB CS189) Gitee 下载 Github 下载 SourceForge 下载 Algo...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
(总结)阿里面试问了ArrayList,都问了啥?
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
Linux命令使用汇总
修改下载源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup #备份当前也就是默认官方的源列表 sudo gedit /etc/apt/sources.list #修改sources.list文件中源的列表,删除全部内容,替换为国内源地址。 保存编辑好的文件。 sudo apt-get update #更新源列表,换源后必须执...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
【程序人生】程序员接私活常用平台汇总
00. 目录 文章目录00. 目录01. 前言02. 程序员客栈03. 码市04. 猪八戒网05. 开源众包06. 智城外包网07. 实现网08. 猿急送09. 人人开发10. 开发邦11. 电鸭社区12. 快码13. 英选14. Upwork15. Freelancer16. Dribbble17. Remoteok18. Toptal19. AngelList20. Topcoder21. ...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
这是一份集合一线大厂Android工程师必备技能体系+学习路线!
一份学习路线图,非常赞,推荐给大家。 目录 Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashCode方法 ArrayList与LinkList区别与联系 GC机制 Java反射机制,Java代理模式 Java泛型 S...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
立即提问