我必须承认,这总是让我困惑某些Windows API如何接受字符串.以SetWindowText()为例.现在任何带有指向任何东西的函数通常意味着它不存储该对象,而只是使用传递的指针.因此,调用者有责任确保传递给它的对象随时存在.那么您期望下面将打印出的最终消息是什么?
TCHAR * label = new TCHAR[50]();
_tcscpy( label, _T("allocated string") );
m_wndStaticLabel.SetWindowText( label );
_tcscpy( label, _T("string has changed") );
Run Code Online (Sandbox Code Playgroud)
理论上我希望它打印"字符串已更改"但它打印"已分配的字符串".同理:
CString label = _T("CString Label");
m_wndStaticLabel.SetWindowText( label );
Run Code Online (Sandbox Code Playgroud)
在这种情况下,一个局部变量'label`的指针正在传递给它,但仍然没有问题.控件总是打印正确的字符串,即使它收到堆栈上分配的字符串指针.
这意味着控件实际上分配了自己的内存,并将其分配给控件而不是我们传递的指针,但这一事实从未记录过.这有点误导吗?当我传递指向函数的指针时,我立即提醒自己的一件事是我不应该在函数返回之前销毁它,但在这种情况下不是这种情况,也没有记录.
所以我的问题最终只是缺少文档,或者当我们将指针传递给一个对象时它还有其他东西,但它的行为就像我们按值传递对象一样?
我想迭代.xml文件(所选文件夹及其子目录下的所有文件),这可能QDirIterator吗?
QDirIterator iter( rootDir, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
QString fileName;
while(iter.hasNext() )
{
qDebug() << iter.next();
fileName = iter.fileName();
// now I have to check if fileName is indeed a .xml extension
}
Run Code Online (Sandbox Code Playgroud)
从上面的代码可以看出,如果我的迭代器只能跳转到.xml文件,而不是在循环中检查文件扩展名.这可能吗?
我试图解决这个问题,似乎我必须使用QItemSelectionModel,但我找不到如何连接的示例.
我在.h文件中定义了.
QItemSelectionModel* selectionModel;
Run Code Online (Sandbox Code Playgroud)
现在在视图的构造函数中,我设置:
selectionModel = ui->treeView->selectionModel();
// the following line is not compiling!
connect(ui->treeView->selectionModel(), SIGNAL( ui->treeView->selectionModel(const QModelIndex&, const QModelIndex &) ),
this, this->selectionChanged ( QItemSelection & sel, QItemSelection & desel) );
Run Code Online (Sandbox Code Playgroud)
我以为会有预定义的插槽,但我找不到一个所以我添加了这个(我在这里找到的语法)
void MyDialog::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
qDebug() << "Item selection changed";
}
Run Code Online (Sandbox Code Playgroud)
我也尝试用QModelIndex替换QItemSelection但仍然不起作用.
我需要做什么才能在选择发生变化时获得通知,而不是显然获取新选择的项目?
我正在创建一个示例来理解 Qt 中的线程,并希望我的工作线程在每次增量之间休眠 1 秒,以便我可以看到调试输出。但是睡眠使我的主 GUI 线程无响应。
这是我在OddCounter课堂上的插槽功能。
void OddCounter::count()
{
for (int i = 0; i < 10; i++)
{
counter += 2;
qDebug() << counter;
QThread::sleep( 1 );
}
}
Run Code Online (Sandbox Code Playgroud)
我调用这个线程的主窗口类是:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
oddCounter = new OddCounter;
connect(this, SIGNAL(startOddCounter()), evenCounter, SLOT(count()), Qt::QueuedConnection );
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
OddCounter oddCounter;
oddCounter.moveToThread( &thread );
thread.start();
emit startOddCounter();
}
Run Code Online (Sandbox Code Playgroud)
问题是当我按下按钮时,计数器工作并在每一秒过去后显示下一个增量,但主窗口一直没有响应!这个不对!我希望我的主窗口能够响应并且只有线程应该休眠。我怎么做?
MFC已经定义了这样的
#ifdef UNICODE
#define DrawText DrawTextW
#else
#define DrawText DrawTextA
#endif // !UNICODE
Run Code Online (Sandbox Code Playgroud)
但是我正在使用一个也有DrawText()函数的库,我猜MFC也定义了这个调用的变化,我收到了这个调用的链接器错误,因为很明显这个库没有名称为DrawTextW(...)的函数
如何使库函数在我的MFC应用程序中工作?
我正在使用 WinDbg 进行调试器会话。我输入lm命令,它显示加载的模块,但我不太明白下面的(导出符号)是什么意思?
048c0000 0550c000 Db (export symbols) Db.dll
05520000 05535000 Graph (export symbols) Graph.dll
Run Code Online (Sandbox Code Playgroud)
我原以为它会说符号未加载、加载或延迟,但这都不是。在这种情况下,(出口符号)表示什么?
构建可执行文件时,它会存储它生成的 pdb 文件的路径。我怎样才能找到这个路径给我的可执行文件?
我已将字符串移至资源中,幸运的是,我有LPCTSTR运算符可以方便地实例化字符串,例如:
CString str( (LPCTSTR) IDS_MY_STRING);
Run Code Online (Sandbox Code Playgroud)
现在我想做类似的类型转换,MessageBox()因此它也从资源加载字符串,所以我这样做:
MessageBox( hWnd, (LPCTSTR) IDS_MY_STRING , _T("Error"), MB_RETRYCANCEL);
Run Code Online (Sandbox Code Playgroud)
但这不起作用,它可以编译但在运行时崩溃。现在以下内容有效:
MessageBox( hWnd, (CString) (LPCTSTR) IDS_MY_STRING , _T("Error"), MB_RETRYCANCEL);
Run Code Online (Sandbox Code Playgroud)
我的问题是,无论如何,MessageBox()它都作为LPCTSTR第二个参数,那么为什么我们必须另外进行从 到 的类型转换LPCTSTR才能CString使其工作?
我似乎无法弄清楚是否有办法在perforce中删除更改列表.这p4 obliterate是关键,但它似乎需要文件名.在我的错误更改列表中有很多文件,因此输入它们是不可行的.我可以通过更改列表删除吗?我确实看到了类似的问题,但它们似乎是通过文件名+修订版来完成的.
请注意,在我的情况下,我正在删除最新的提交,因此我知道之后没有任何内容,这就是为什么它的安全性.我只需要通过更改列表获取它,而不是按名称获取100多个文件.
我需要打印定期报告和批量报告.我正在使用podofo库.我计划为每个报告使用单独的类,但每个类将需要下面的一些常用函数(现在在另一个项目的一个类中).
int CPdfBatchReport::CalculateMaxRowsInEmptyPage(void)
{
int rows = MaxPageHeight / PDF_TABLE_STANDARD_ROW_HEIGHT;
// because the first will always be the column header in every page, we substrct 1 to account for that
rows = rows - 1;
return rows;
}
// Calculates the max rows in current page. The current page is determined
// by the current x, y position
int CPdfBatchReport::CalculateMaxRowsInCurrentPage(void)
{
float AvailablePageHeight = pPage->GetPageSize().GetHeight() - PDF_BOTTOM_MARGIN - y;
int rows = AvailablePageHeight / PDF_TABLE_STANDARD_ROW_HEIGHT;
// because the first will …Run Code Online (Sandbox Code Playgroud)