gpt4 book ai didi

c++ - Qt槽没有激活

转载 作者:行者123 更新时间:2023-11-27 23:40:49 25 4
gpt4 key购买 nike

所以我有 2 个类,一个名为 ConsoleInput,其中包含成员函数 check4Flood,第二个名为 AntiFloodSys,其中存在信号槽系统的连接函数,以及它的信号 (QTimer) 和槽。AntiFloodSys 对象位于 check4Flood 成员函数中,该函数的范围永远不会结束,因为内部存在无限 while 循环。因此该对象永远不会被破坏。因此,当创建对象 anti 时,将调用 AntiFloodSys 类的构造函数,从而调用信号和槽之间的连接。我的问题是在代码的哪一点连接超时信号和 mySlot 是分开的,所以永远不会触发插槽?

ConsoleInput cpp 文件如下所示:

void ConsoleInput::check4Flood(int& lineCounter)
{

AntiFloodSys anti;

while(1)
{
std::string chatLine[2];
std::cin >> chatLine[0] >> chatLine[1];
anti.input(chatLine[0], chatLine[1]);
}
}

和这样的 AntiFloodSys 类:

AntiFloodSys::AntiFloodSys(QObject *parent) : QObject(parent)



{
timeFrame = 1000 ;
timer = new QTimer;

connect(timer, SIGNAL(timeout()), this, SLOT(mySlot()));

timer->start(timeFrame);
std::cout << "AntiFloodSys constructor - timer starts " << "\n";
}


AntiFloodSys::~AntiFloodSys()
{
std::cout << "AntiFloodSys Destructor" << "\n";
}

void AntiFloodSys::input(std::string nick_, std::string line_)
{
nick = nick_;
line = line_;

std::cout << "nick: " << nick << " line: " << line << " " << "\n";
}


void AntiFloodSys::mySlot()
{
std::cout << "slot" << "\n";
}

最佳答案

问题出在您的while(1):Qt 事件循环永远不会被处理,因为您的程序在这个循环中被阻塞

您可以强制事件循环处理调用 QCoreApplication::processEvents()std::cin 是一个阻塞函数。因此,它不会完全解决您的问题。

您应该将循环移动到一个专用线程中,该线程会将数据发送到主线程(例如信号/槽系统)。

您还可以使用 QSocketNotifier 类来创建非阻塞标准输入访问。

一个简单的例子:

class Widget: public QWidget
{
Q_OBJECT
public:
Widget(): QWidget(), input(new QLabel("Edit", this))
{
connect(this, &Widget::displayText, input, &QLabel::setText);
}
private:
QLabel* input;
signals:
void displayText(QString const&);
};


class UserInput: public QObject
{
Q_OBJECT
public:
UserInput(): QObject()
{}

public slots:
void run()
{
while(1) // User Input in an infinite loop
{
std::string line;
std::cin >> line;
emit inputReceived(QString::fromStdString(line));
}
}
signals:
void inputReceived(QString const&);
};

int main(int argc, char** argv) {
QApplication app(argc, argv);
Widget* w = new Widget();
UserInput* input = new UserInput();

QThread* thread = new QThread();
input->moveToThread(thread); // Move the user input in another thread

QObject::connect(thread, &QThread::started, input, &UserInput::run);
QObject::connect(input, &UserInput::inputReceived, w, &Widget::displayText);

thread->start();
w->show();

return app.exec();
}

关于c++ - Qt槽没有激活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55054255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com