小编zar*_*zar的帖子

Windows API如何接受字符串

我必须承认,这总是让我困惑某些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`的指针正在传递给它,但仍然没有问题.控件总是打印正确的字符串,即使它收到堆栈上分配的字符串指针.

这意味着控件实际上分配了自己的内存,并将其分配给控件而不是我们传递的指针,但这一事实从未记录过.这有点误导吗?当我传递指向函数的指针时,我立即提醒自己的一件事是我不应该在函数返回之前销毁它,但在这种情况下不是这种情况,也没有记录.

所以我的问题最终只是缺少文档,或者当我们将指针传递给一个对象时它还有其他东西,但它的行为就像我们按值传递对象一样?

c++ winapi mfc pointers

4
推荐指数
1
解决办法
202
查看次数

如何使用QDirIterator迭代某些类型的文件

我想迭代.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文件,而不是在循环中检查文件扩展名.这可能吗?

c++ qt

4
推荐指数
1
解决办法
6266
查看次数

如何在QTreeView中获取选择更改通知

我试图解决这个问题,似乎我必须使用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但仍然不起作用.

我需要做什么才能在选择发生变化时获得通知,而不是显然获取新选择的项目?

c++ qt

4
推荐指数
1
解决办法
7137
查看次数

如何在 Qt 的工作线程中休眠?

我正在创建一个示例来理解 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)

问题是当我按下按钮时,计数器工作并在每一秒过去后显示下一个增量,但主窗口一直没有响应!这个不对!我希望我的主窗口能够响应并且只有线程应该休眠。我怎么做?

c++ qt multithreading

4
推荐指数
1
解决办法
1292
查看次数

如何禁用更改Unicode或ASCII的函数名称的MFC宏

MFC已经定义了这样的

#ifdef UNICODE
#define DrawText  DrawTextW
#else
#define DrawText  DrawTextA
#endif // !UNICODE
Run Code Online (Sandbox Code Playgroud)

但是我正在使用一个也有DrawText()函数的库,我猜MFC也定义了这个调用的变化,我收到了这个调用的链接器错误,因为很明显这个库没有名称为DrawTextW(...)的函数

如何使库函数在我的MFC应用程序中工作?

c++ unicode mfc static-libraries visual-c++

3
推荐指数
1
解决办法
512
查看次数

lm命令中“导出的符号”是什么意思

我正在使用 WinDbg 进行调试器会话。我输入lm命令,它显示加载的模块,但我不太明白下面的(导出符号)是什么意思?

048c0000 0550c000   Db         (export symbols)       Db.dll
05520000 05535000   Graph      (export symbols)       Graph.dll
Run Code Online (Sandbox Code Playgroud)

我原以为它会说符号未加载、加载或延迟,但这都不是。在这种情况下,(出口符号)表示什么?

windbg

3
推荐指数
1
解决办法
948
查看次数

如何提取存储在exe中的路径(pdb文件)?

构建可执行文件时,它会存储它生成的 pdb 文件的路径。我怎样才能找到这个路径给我的可执行文件?

windows exe path

3
推荐指数
1
解决办法
3059
查看次数

为什么我需要这个 CString 类型转换?

我已将字符串移至资源中,幸运的是,我有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使其工作?

c++ string mfc

2
推荐指数
1
解决办法
1259
查看次数

如何删除perforce中的更改列表

我似乎无法弄清楚是否有办法在perforce中删除更改列表.这p4 obliterate是关键,但它似乎需要文件名.在我的错误更改列表中有很多文件,因此输入它们是不可行的.我可以通过更改列表删除吗?我确实看到了类似的问题,但它们似乎是通过文件名+修订版来完成的.

请注意,在我的情况下,我正在删除最新的提交,因此我知道之后没有任何内容,这就是为什么它的安全性.我只需要通过更改列表获取它,而不是按名称获取100多个文件.

perforce

2
推荐指数
1
解决办法
4118
查看次数

将公共代码移动到基类是假设没有的好习惯吗?

我需要打印定期报告和批量报告.我正在使用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)

c++ architecture oop code-reuse

2
推荐指数
1
解决办法
632
查看次数