在我正在处理的应用程序中,我有一个 QLineEdit,它附有一个标准 QObject::connect 到一个插槽:
QObject::connect(m_searchBar, SIGNAL(textChanged(const QString &)),this,SLOT(slot_searchBar()));
如您所见,它将 textChanged 信号连接到我创建的插槽。此插槽如下所示:
void LibraryWidget::slot_searchBar()
{
QString stringToFind = m_searchBar->text();
m_searchResults->clear();
if(stringToFind.isEmpty())
{
//set stacked widget back to the library when no text in search bar
m_libraryAndSearch->setCurrentWidget(libTree);
}
else
{
//show the search results
QFont headerFont;
QTreeWidgetItem * searchingMsg = new QTreeWidgetItem;
headerFont = searchingMsg->font(0);
headerFont.setBold(false);
headerFont.setItalic(true);
searchingMsg->setText(0, "Searching...");
searchingMsg->setFont(0, headerFont);
Qt::ItemFlags currentState = searchingMsg->flags();
Qt::ItemFlags noSelect = (!(Qt::ItemIsSelectable) & currentState);
searchingMsg->setFlags(noSelect);
m_searchResults->addTopLevelItem(searchingMsg);
m_libraryAndSearch->setCurrentWidget(m_searchResults);
//m_searchThread->setTerminateAndWait();
//m_searchThread->beginThread(stringToFind);
int testTwo = 0;
for(int testInt = 0; testInt < 1000000000; testInt++)
{
testTwo++;
}
int testingThree = 0;
}
}
希望它的重要性有限,但最好向您展示,以防问题的根源在这里。
如果我在搜索栏中输入一个字符串,即有问题的 QLineEdit(很快)并查看附加的调试器(Visual Studio 2010)发生了什么,那么我会看到最奇怪的事情:
如果我在搜索栏中已经有“Jake”(来自之前的搜索,输入缓慢)然后快速输入“gh”,那么stringToFind
第一次运行时的值为“Jakegh”,第二次运行时的值为“Jakeg” .
就好像 Qt 已将信号发射添加到堆栈而不是队列,然后以相反的顺序将它们送回事件循环。
问题是:有人知道这里发生了什么吗?有没有人经历过类似的结果?
Qt 4.7 版
目前的代码只是为了重现问题,它没有做任何事情。int testTwo -> int testingThree 只是为了减慢代码速度。
谢谢...
编辑 当字符串作为函数参数传递到插槽时,观察到相同的行为。线
QString stringToFind = m_searchBar->text();
试图调试和规避这种现象。
编辑两个
我试图在家里重新创建这个。在 Mac OS X 10.7 上从终端构建 Qt,因此没有可用的调试器。我正在使用一个非常简单的类和 main.cpp,其格式与上述相同,我无法让 Qt 以相反的顺序为我提供字母。我可以让它错过信号。我已将行编辑连接到文本编辑,这样每次行编辑中的文本更改时,都会使用QTextEdit::append(( const QString & text ))
.
例如,如果我键入“N”、“e”、“w”,则应将“N”、“Ne”、“New”打印到文本编辑中。但是,有时它只是打印“N”、“New”。我有一个 for 循环减慢一切,并且必须非常快地击键。
第一次导致这种现象发生的系统必然比我构建的系统复杂得多,它在调试中运行并且运行缓慢。仍然不明白为什么这会导致这种行为,而且它肯定是这样的!