我正在编写一个Windows应用程序(在Qt 4.6中) - 在某些时候 - 将1到76000之间的任意数量的数据集插入到某个oracle(10.2)表中.应用程序必须从序列中检索主键或至少主键范围.然后,它将ID存储在列表中,该列表用于批处理执行准备好的查询.
(注意:不应使用触发器,序列也由其他任务使用)
为了避免调用序列X次,我想用X递增序列.
到目前为止我发现的是,在程序中可以使用以下代码:
ALTER SEQUENCE my_sequence INCREMENT BY X;
SELECT my_sequence.CURVAL + 1, my_sequence.NEXTVAL
INTO v_first_number, v_last_number
FROM dual;
ALTER SEQUENCE my_sequence INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)
我有两个主要问题:
这个概念是多用户证明吗?或者可能发生以下事情:
Sequence is at 10,000
Session A sets increment to 2,000
Session A selects 10,001 as first and 12,000 as last
Session B sets increment to 5,000
Session A sets increment to 1
Session B selects 12,001 as first and 12,001 as last
Session B sets …Run Code Online (Sandbox Code Playgroud)我已经在库中运行了这段代码很长一段时间了:
MyClass::MyClass()
: QDialog()
{
// (...)
setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint );
// (...)
}
Run Code Online (Sandbox Code Playgroud)
然后,在更改了库的各个部分之后,我突然得到了这个消息:
error C2664: 'QWidget::setWindowFlags': cannot convert parameter 1 from 'int' to 'Qt::WindowFlags'
Run Code Online (Sandbox Code Playgroud)
显然它没有找到| QFlags类提供的运算符重载使得|的结果 返回一个int而不是一个QFlags结构.
我知道我可以手动将结果转换为(Qt::WindowFlags)并使其工作,但QFlags通常会使这种类型的转换不必要.
知道什么样的改变会导致这种行为吗?
我包括<QtGui/QDialog>哪些通常就足够了.包括<QtCore/QFlags>不改变行为.
我有一个MSVC++项目,包括一个可执行文件,几个自己的静态库和一些预编译的静态第三方库.exe使用增量链接以加快构建时间.
当我在可执行项目中更改.cpp文件时,编译+链接非常快(<10s).
但是,当我在我自己的一个库中更改.cpp文件时,可执行项目似乎正在针对它使用的每个库执行完整链接.
我不太确定它是否真的是一个完整的链接,但是从"vc90.pdb未找到"链接器警告,我可以告诉它链接到一些根本没有改变的外部库.
这是项目结构的一个例子:
ExtLib1,ExtLib2和ExtLib3MyLib,使用第三方库ExtLib1MyExe,使用MyLib和ExtLib1-3改变.cpp文件MyLib,然后将导致MyExe被链接到MyLib,ExtLib1,ExtLib2和ExtLib3,即使增量链接被打开.
在我的项目中,完整链接大约需要5分钟,所以我问:有没有办法只重新链接已更改的库?
我正在尝试在Qt Creator中设置OpenCV,但我遇到了一些问题.我在Qt Creator .pro文件中添加了OpenCV路径
INCLUDEPATH += /usr/local/include/opencv
LIBS += -L/usr/local/lib \
-lopencv_core \
-lopencv_imgproc \
-lopencv_highgui \
-lopencv_ml \
-lopencv_video \
-lopencv_features2d \
-lopencv_calib3d \
-lopencv_objdetect \
-lopencv_contrib \
-lopencv_legacy \
-lopencv_flann
Run Code Online (Sandbox Code Playgroud)
我想阅读并在此代码中显示图像
void MainWindow::on_pushButton_clicked()
{
cv::Mat matInput = cv::imread("LP.jpg");
if( matInput.empty())
{
std::cout<<"Can't load image "<<std::endl;
}
cv::namedWindow("Show");
cv::imshow("Show", matInput);
cv::waitKey();
}
Run Code Online (Sandbox Code Playgroud)
当我运行我的项目时,它显示以下消息:
启动/ home/vasan/Qt/build-OpenCVWithQt-Desktop-Debug/OpenCVWithQt ...
程序意外完成.
/home/vasan/Qt/build-OpenCVWithQt-Desktop-Debug/OpenCVWithQt退出,代码为0
我遇到以下问题:我的项目有一个make_all.bat文件,该文件可以执行以下几个构建:
call make_first_component.bat
if %ERRORLEVEL% gtr 0 ( exit /b %ERRORLEVEL% )
call make_second_component.bat
if %ERRORLEVEL% gtr 0 ( exit /b %ERRORLEVEL% )
Run Code Online (Sandbox Code Playgroud)
该脚本中没有其他行(除了 echo命令)。
现在,当我通过双击或从命令行手动调用该脚本时,make_first_component.bat会执行exit /b 1以下操作:make_all.bat按预期退出。
当我从詹金斯工作中调用脚本(下面的代码)时, make_all.bat即使第一个组件失败继续第二个组件。如果然后我以这种行为登录到构建从站并在那里手动启动批处理文件,则在第一个组件出现故障时它将退出。
那么詹金斯做了什么打破了这个%ERRORLEVEL%概念?
PS:我尝试过setlocal enabledelayedexpansion然后使用!ERRORLEVEL!,但始终为0。
注意:jenkins作业具有“执行Windows批处理命令”步骤,如下所示:
cd %WORKSPACE%\src\bat
echo Setting up Visual Studio environment
call "%VS120COMNTOOLS%..\..\VC\vcvarsall.bat" amd64
echo Building Project
call make_all.bat
if %ERRORLEVEL% gtr 0 ( exit /b %ERRORLEVEL% )
Run Code Online (Sandbox Code Playgroud)
(这是完整的步骤)
我最近用Visual Studio 2013设置了一个Windows 8.1 64位机器(可能是32位,至少它安装在Program Files(x86)上).我还安装了Oracle 11.2.0.1 64位客户端和Oracle Data Provider for .NET.
当我做gacutil/l | findstr Oracle.DataAccess,我得到四个条目,包括以下内容:
Oracle.DataAccess, Version=2.112.1.0, ..., processorArchitecture=AMD64
Run Code Online (Sandbox Code Playgroud)
但是,在尝试添加程序集时,我无法在任何列表中找到Oracle.DataAccess(尽管如此,Oracle.Web存在于Assemblies-> Extensions下).
我必须安装32位Oracle客户端(或简称32位ODP.NET),因为Visual Studio是32位吗?如果是这样,软件是否能够在64位应用程序和64位Oracle客户端(64位ODP.NET)的64位系统上运行?
我的应用程序(Qt 4.6)要求我在列表中显示某些消息,这些消息在添加新行时总是向下滚动(因此最近的行总是可见的).
由于我在整个过程中遇到性能问题,包括显示这些单行消息,我运行了一些测试,发现我使用的QListWidget是主要问题.
我创建了一个简单的测试项目,其中包含一个默认列表小部件"listWidget"和一个按钮"pushButton",它在循环中添加了1000个项目.这两个小部件将添加到主窗口的布局中.这是.cpp代码(.h是默认值+插槽定义)
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_released()
{
for( int iLine = 0; iLine < 1000; iLine++ )
{
ui->listWidget->addItem(
QString( "%1: This is a dummy text" )
.arg( QString::number( iLine ).rightJustified( 4, '0' ) )
);
ui->listWidget->scrollToBottom();
QApplication::processEvents();
}
}
Run Code Online (Sandbox Code Playgroud)
没有scrollToBottom(),性能也没问题,但是如果我添加scrollToBottom,它还需要我为repaint添加processEvents(),事情开始变得非常慢.当您调整窗口高度(以及隐式列表窗口小部件)时,您可以逐字地观察更新速度的变化.
我尝试过使用性能标记,比如在构造函数中添加以下行:
ui->listWidget->setLayoutMode( QListWidget::Batched );
ui->listWidget->setBatchSize( 10 );
Run Code Online (Sandbox Code Playgroud)
这加快了很多,但scrollToBottom()不再起作用.
有谁知道如何提高速度?只要他们使用Qt,请随意提出完全不同的方法.
[编辑]看一下例如Qt Creator的安装对话中的详细信息列表的性能,或者像wireshark这样的程序,每秒显示几行没有问题,我知道自动滚动列表哪些是高速更新的一般来说可能.主要问题是:这可能与Qt有关吗?
我试图在一个单独的线程中执行一些工作,并在工作完成后停止该线程.
我已经建立了这样的连接
thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );
Run Code Online (Sandbox Code Playgroud)
但是当我发出finished()信号时,从不调用quit()槽.命令行不显示与失败连接相关的任何警告.
我创建了一个简单的测试项目来缩小问题范围,我得到了同样的行为:
TestClass.h:
#ifndef TESTCLASS_H
#define TESTCLASS_H
class TestClass : public QObject
{
Q_OBJECT
public:
TestClass() { }
signals:
void finished();
public slots:
void doWork();
}
#endif // TESTCLASS_H
Run Code Online (Sandbox Code Playgroud)
TestClass.cpp:
#include "TestClass.h"
#include <QtCore/QDebug>
void TestClass::doWork()
{
qDebug() << "Starting";
for( long i = 0; i < 1000000000; i++ );
qDebug() << "Done";
emit finished();
};
Run Code Online (Sandbox Code Playgroud)
和main.cpp:
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include "TestClass.h"
int main( int argc, char* argv[] …Run Code Online (Sandbox Code Playgroud) 我试图在我的一个Qt5项目中使用ODBC驱动程序.
我编译QODBC驱动程序并将驱动程序dll复制到Qt\Qt5.0.0\5.0.0\msvc2010\plugins\sqldrivers文件夹.
当我尝试以下代码时:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3
Run Code Online (Sandbox Code Playgroud)
如果我尝试加载,会遇到相同的错误QODBC3.
即使QODBC和QODBC3驱动程序存在,Qt仍然无法加载QODBC驱动程序.
我正在运行Windows 7(64位)PC.
有没有人遇到过这样的错误?什么可能是错的线索?
我正在尝试创建一个CMakeLists.txt尝试 find的文件Qt5,如果失败,则尝试回退到Qt4安装。到目前为止,该脚本有效,但如果Qt5未安装,我将始终收到警告。
请注意,FindQt5.cmake由Qt5提供,如果仅Qt4安装则不可用。
基本结构是这样的:
cmake_minimum_required(VERSION 2.8.11)
message("-- Searching for Qt5")
find_package(Qt5 COMPONENTS Core Xml Network)
if (Qt5_FOUND)
message("-- Searching for Qt5 - found version ${Qt5Core_VERSION}")
else (Qt5_FOUND)
message("-- Searching for Qt5 - not found")
# ...
endif (Qt5_FOUND)
Run Code Online (Sandbox Code Playgroud)
如果Qt5未安装(或未正确设置),警告消息如下:
通过在 CMAKE_MODULE_PATH 中不提供“FindQt5.cmake”,该项目要求 CMake 查找“Qt5”提供的包配置文件,但 CMake 没有找到。
找不到“Qt5”提供的具有以下任何名称的包配置文件:
Qt5Config.cmake
qt5-config.cmake将“Qt5”的安装前缀添加到CMAKE_PREFIX_PATH或将“Qt5_DIR”设置为包含上述文件之一的目录。如果“Qt5”提供单独的开发包或SDK,请确保已安装。
有没有办法抑制这个警告?我也会接受其他方法来检测是否Qt5已安装。
我有一个类,提供可以使用的自定义静态比较器std::sort.以下编译就好了(剥离到最小代码示例):
#include <vector>
#include <string>
#include <algorithm>
class StringUtils
{
public:
static bool customStringCompare(const std::string&, const std::string&) { return true; }
};
void test()
{
std::vector<std::string> testList;
std::sort(testList.begin(), testList.end(), StringUtils::customStringCompare);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我向StringUtils类添加一个重载时
static bool customStringCompare(const char*, const char*) { return true; }
Run Code Online (Sandbox Code Playgroud)
以下工作:
void test2()
{
std::string s1, s2;
StringUtils::customStringCompare(s1, s2);
}
Run Code Online (Sandbox Code Playgroud)
但是,std::sort上面的调用在MSVC 2015 Update 2中产生编译器错误C2672(未找到匹配的重载),C2780(预期2个参数 - 3支持),C2783("_Pr"的模板参数无法推断).
为什么std::sort在这种情况下找不到匹配的重载?
我在Windows 8.1 64位和Ubuntu 14.04上使用Qt 5.3.与Ubuntu相比,Windows上的调试需要很长时间.
为什么会有这么大的差异?我是否需要在Windows上设置任何特殊功能?