我已经使用vs2015 x64原生工具手动编译了qt 4.8.6,因为这个Visual Studio版本没有任何官方支持。为了避免编译错误并添加新的mkspec,我使用了这个帮助(How to build Qt 4.8.6 with Visual Studio 2015 without official support?)。 首先发现的问题是QTreeWidget无法正常工作:无法选择项目。简单的例子表明,选择项目后立即取消选择。
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent){
QTreeWidget* tree = new QTreeWidget;
QTreeWidgetItem* item1 = new QTreeWidgetItem;
item1->setText(0, "item1");
QTreeWidgetItem* item2 = new QTreeWidgetItem;
item2->setText(0, "item2");
tree->addTopLevelItem(item1);
tree->addTopLevelItem(item2);
this->setCentralWidget(tree);
connect(tree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(on_item_change(QTreeWidgetItem *, QTreeWidgetItem *)));
connect(tree, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(on_item_click(QTreeWidgetItem *, int)));
}
void MainWindow::on_item_change(QTreeWidgetItem *current, QTreeWidgetItem *previous) {
printf("item changed from %p to %p\n", previous, current);
}
void MainWindow::on_item_click(QTreeWidgetItem * item, int column) {
std::cout << "item clicked " << item->text(column).toStdString() << "\n";
}
点击几次后输出
item changed from 0000000000000000 to 00000160CEE5E060
item changed from 00000160CEE5E060 to 0000000000000000
item clicked item1
item changed from 0000000000000000 to 00000160CEE5E650
item changed from 00000160CEE5E650 to 0000000000000000
item clicked item2
item changed from 0000000000000000 to 00000160CEE5E060
item changed from 00000160CEE5E060 to 0000000000000000
item clicked item1
在视觉上看起来没有选择任何项目,树中的当前项目为NULL。 我尝试过qt 4.8.7并得到了相同的结果。 在最新的qt版本上,此示例正常工作。 所以,有一个问题:如何避免这个错误?也许有人用不同的方式用VS2015构建qt 4.8?或者它可能是代码错误?